노무현 대통령 배너


2006. 7. 20. 13:56

[본문스크랩] malloc 하여 메모리를 할당하는것과 ...... 차이점

문자열상수인 "(콜론) 으로 둘러쌓인 것들은
이미 프로그램 실행시작과 동시에 메모리에 적재된 상수입니다.
그러므로 메모리 할당으로 메모리가 소비되었다고 해도 문자열 상수 부분은 이미 고유한 영역인 것입니다.

malloc 은 Heap이라는 성격을 가진 메모리를 다루는 것이고 문자열 상수는 Const 영역입니다.
const 영역의 특성은 프로그램 적재시에
동시에 메모리에 확보되는 영역입니다.
이와 약간 다른것이 bss 영역인데
이 영역은 초기화는 안되었지만 메모리에 그 공간을 확보해 놓은것입니다.
bss의 예로서는
static char a[10];
이런게 초기화 되지는 않았지만 범위를 지정한 배열과 같은 경우를 bss영역으로 볼수 있습니다.

반면에 heap은 그 외의 사용가능한 메모리를 지칭합니다. heap은 프로그램 실행시점에서 적재되는 것이 아니고 실행시간에 따른 영역의 확보라고 할수 있겠습니다.

그리고 stack 영역은 자동변수 모두를 칭하는 것이고요.

정리하자면 크게 다음과 같은 영역이 존재합니다.

code : 실행코드가 적재되는 영역
data : 상수로 초기화 된 상태이지만 값을 변경가능한 영역
const : 상수 그 자체이며 변경하지 않는것을 약속하는 영역
bss : 초기화가 이뤄지지 않았으며 변경이 가능한 영역 (편의상 커널이 0으로 초기화 해주는 static영역과 그렇지 않는 영역이 있음)
stack : 국지적으로 사용되는 변수영역
heap : 나머지 여유공간 전체

여기서 실행시 메모리에 적재되는 것과 그렇지 않은것에 대한 구분만 하신다면 왜 그런지 이해가 되실거라 사료됩니다.

이해를 돕기 위해서 아래와 같은 소스가 있을때
"Hello"를 출력하는 시점과 "World"를 출력하는 시점에서 메모리 사용량은 같다는 겁니다.

Code:

void a(void)
{
char *a;
fprintf(stdout, "Hellon");
a = "aaaaaaaa";
fprintf(stdout, "%sn", a);
fprintf(stdout, "Worldn");
}



반대로 다음과 같은 경우 "Hello"와 "World"를 출력하는 시점에서의 메모리 사용량은 다릅니다.

Code:

void a(void)
{
char *a;
fprintf(stdout, "Hellon");
a = malloc(1);
fprintf(stdout, "Worldn");
}



[ Edited by minzkn On Date 17/12/2003 ]