메모리 영역은 그림으로 나타내면 아래와 같다.
각 변수 및 함수의 주소를 출력하여 비교
$ ./a.out
-------------------------------- code --------------------------------------
printf addr : 0x4005b8
Init global const int addr : 0x400c10
Init main const static int addr : 0x400c18
Init global const static int addr : 0x400c14
-------------------------------- data --------------------------------------
Init global int addr : 0x600fcc
Init global static int addr : 0x600fd0
Init main static int addr : 0x600fd4
-------------------------------- bss ---------------------------------------
Zero global int addr : 0x600fe8
Uninit global int addr : 0x600fec
Uninit global static int addr : 0x600ff4
Uninit main static int addr : 0x600ff8
-------------------------------- stack -------------------------------------
Init main int addr : 0x7fff3605609c
Init main const int addr : 0x7fff36056098
Uninit main int addr : 0x7fff36056094
--------------------------------- heap -------------------------------------
New main int addr1 : 0x7fff36056088
New main int addr2 : 0x7fff36056080
void fct1(int c) {
int d = 30;
/* fct1 함수의 지역변수 d, 매개변수 c 출력*/
printf("d addr : %p, c addr : %p\n", &d, &c);
}
void fct2(int e) {
int f = 40;
/* fct2 함수의 지역변수 f, 매개변수 e 출력 */
printf("f addr : %p, e addr : %p\n", &f, &e);
}
int main()
{
int i = 100;
fct1(i);
fct2(i);
return 0;
}
위의 코드를 출력하면 아래와 같은 결과 가 나온다.
살펴보면 fct1
의 매개변수, 지역변수가 해제된 후 fct2
의 매개변수, 지역변수가 같은 주소로 메모리가 할당된다.
$ ./a.out
d addr : 0x7ffe966004ac, c addr : 0x7ffe9660049c
f addr : 0x7ffe966004ac, e addr : 0x7ffe9660049c