Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- server
- web
- 백준
- dfs
- JavaScript
- graph
- Math
- sorting
- BASIC
- DP
- Cleancode
- programmers
- String
- BFS
- 따라하면서 배우는 C언어
- php
- Algorithm
- greedy
- 따라하며 배우는 C언어
- Python
- C언어
- 생활코딩
- 인프런
- Algospot
- udemy
- 종만북
- 정수론
- 따배씨
- C
- BOJ
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 12.3 변수의 영역과 연결 상태, 객체의 지속 기간 본문
따배씨 - 따라하며 배우는 C언어
12강 Storage Classes, Linkage and Memory Management
12.3 변수의 영역 Scope 과 연결 상태 Linkage, 객체의 지속 기간 Duration
#include <stdio.h>
/*
Variable scopes (visibility)
- block, function, function prototype, file.
*/
// file scope
int g_i = 123; // global variable
int g_j; // global variable
void func1(){
g_i++; // uses g_i
}
void func2(){
g_i += 2; // uses g_i
// local = 456; // Error
}
int main(){
// main function scope
int local = 1234;
func1();
func2();
printf("%d\n", g_i); // uses g_i
// 126
printf("%d\n", g_j); // Not initialized
// 0
printf("%d\n", local);
// 1234
return 0;
}
printf("%d\n", g_j); // Not initialized
// 0
- 초기화 되지 않은 정적 변수는 BSS 메모리 공간에 저장되고, 프로그램이 시작 될 때 모두 0으로 초기화
- 효율을 위해 일괄 처리
- BSS (Block Started by Symbel): 전역으로 선언된 초기화 되지 않은 데이터 영역
#include <stdio.h>
/*
Variable scopes (visibility)
- block, function, function prototype, file.
*/
// function prototype scope
void f1(int hello, double world); // to the end fo the protoytpe declaraion
// void vla_param(int n, int m, double ar[n][m]); // gcc only
// functin scope
double func_block(double d){
double p = 0.0;
int i;
for (i = 0; i < 10; i++){
double q = d * i;
p *= q;
if (i == 5)
goto hello;
}
hello:
printf("Hello, world");
return p;
}
int main(){
func_block(1.0);
}
void f1(int hello, double wold){
}
double func_block(double d){
double p = 0.0;
int i;
for (i = 0; i < 10; i++){
double q = d * i;
p *= q;
if (i == 5)
goto hello;
}
hello:
printf("Hello, world");
return p;
}
- goto 문은 동작을 위해 자동으로 function scope 로 범위가 확장
- block scope 는 function scope와 비슷하나, function 을 선언하지 않아도 block만 지정하면 block scope 가능
// main.c
#include <stdio.h>
/*
Linkage
Variables with block scope, function scope, or function prototype scope
- No linkage
File scope variables
- External or internal linkage
*/
int el; // file scope with external linkage (global varible)
static int il; // file scope with inernal inkage
void testLinkage();
int main(){
el = 1024;
testLinkage();
printf("%d\n", el);
// 1025
return 0;
}
/* ------------------------- */
// second.c
#include <stdio.h>
extern int el; // 다른 파일에 선언한 변수를 사용
// extern in il;
void testLinkage(){
printf("DoSomething called\n");
// DoSomething called
printf("%d\n", el);
// 1024
//printf("%d\n", il);
//printf("%d\n", dodgers);
el++;
}
extern int el;
- extern 선언으로 다른 파일에서 선언한 file scope 변수를 호출 가능
static int il;
- 현재 file scope 로 scope 제한
- 다른 file 에서 extrn으로 사용 하려고 할 시, link error 발생
#include <stdio.h>
/*
Storage duration: // duration : 메모리의 지속기간
- static storage duration // 프로그램이 시작될때 부터 끝날때 까지 메모리를 유지
(Note : 'static' keword indicates the linkage type, not the storage duration)
- automatic storage duration // 일반적으로 지역변수, scope 에 따라서 메모리 사용
- allocated storage duration // 동적할당
- thread storage duration // Multi Threading - 고급프로그래밍 기술
*/
void count()
{
int ct = 0;
printf("count = %d\n", ct);
ct++;
}
void static_count(){
static int ct = 0;
printf("static count = %d\n", ct);
ct++;
}
int main(){
count();
// count = 0
count();
// count = 0
static_count();
// static count = 0
static_count();
// static count = 0
return 0;
}
void static_count(){
static int ct = 0;
printf("static count = %d\n", ct);
ct++;
}
- 함수 scope 에서 static 으로 선언한 변수는 static storage duration
- 프로그램이 시작 될 때 메모리가 할당되고, 프로그램이 끝날 때 까지 메모리가 유지
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
'Language > C' 카테고리의 다른 글
[따배씨] 12.5 자동 변수 (0) | 2021.06.13 |
---|---|
[따배씨] 12.4 저장 공간의 다섯 가지 분류 (0) | 2021.06.13 |
[따배씨] 12.2 객체와 식별자, L-value 와 R-value (0) | 2021.06.13 |
[따배씨] 12.1 메모리 레이아웃 훑어보기 (0) | 2021.06.13 |
[따배씨] 11.11 문자열을 숫자로 바꾸는 방법들 (0) | 2021.06.10 |
Comments