p = (int *) malloc(0)을 한다면?

프로그래밍을 하면서 생기는 궁금증은 나를 간혹 미치게 만든다.
그 때문에, 지난 번 function과 stack, 그리고 memory에 대한 간략한 연구를 통해 친구들에게 이상한 놈 취급을 받았던 터라ㅡ아닐 수도 있다ㅡ 앞으로도 나의 궁금증에 관한 포스팅을 올려야 하는지에 대해 고민을 많이 해보았다.

그리고, 다시 궁금증을 해결하기 위해 포스팅을 시작하기로 했다.

이번에 고민하게 된 부분은, "p = (int *) malloc(0)"을 해주게 되면 어떤 결과가 나타날까,이다.
우선, man 명령어를 통해 malloc에 대한 정보를 알아보자.

Standard C Library Functions                           malloc(3C)

NAME
    malloc, calloc, free, memalign, realloc,  valloc,  alloca  -
    memory allocator

SYNOPSIS
    #include <stdlib.h>

    void *malloc(size_t size);

(이하 생략)

return type이 void인 malloc 함수는 size_t size라는 argument를 가진다. 이 size_t size 부분에는 동적으로 할당할 메모리의 크기를 지정해주면 된다. 만약 이 size_t size가 0이라면, 과연 어떻게 될까.

아주 간단하게 소스를 작성해보았다.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
       int *p;
       p = (int *) malloc(0);
       *p = 2;
       printf("p = %x\n", p);
       printf("*p = %d\n", *p);
       free(p);
       return 0;
}

그리고, 이번에도 세 가지의 다른 시스템 상에서 컴파일 후 실행을 해보았다.
파일명은 malloc.c로 지정했으며, 세 가지 시스템의 대략적인 정보는 다음과 같다.
- Ubuntu Linux 6.06 / gcc 4.0.3 (개인PC)
- SunOS 5.8 / gcc 3.3.2 (한양대 정보통신대학 실습용 서버 a.k.a. medusa)
- Debian / gcc 3.2.3 (한양대 cancun lab의 서버 / Operating System 정보는 미확인)

그리고, 그 결과 값은 아래와 같다.
- Ubuntu Linux 6.06 / gcc 4.0.3
p : 804a008
*p : 2

- SunOS 5.8 / gcc 3.3.2
p : 209a0
*p : 2

- Debian / gcc 3.2.3
p : 9ca8008
*p : 2

위의 결과에서처럼, malloc의 size를 0으로 주었음에도, 세 시스템에서 모두 메모리 상에 정상적으로 동적 할당이 이루어졌다. 어쩌면 할당되지 않아야 할 부분이 할당되었을 수도 있을 것이고, 그게 아니라면 다른 이유가 있을 것이다.

인터넷 상에서 malloc(0)이라는 키워드를 통해 정보를 검색하다가 흥미로운 문서를 발견했다. 링크
누군가 나에게 '왜?'인지에 대해 설명해줄 것이라고 믿으면서, 조금 더 관련 자료들을 찾아봐야겠다.
◀ PREV 1 NEXT ▶