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)이라는 키워드를 통해 정보를 검색하다가 흥미로운 문서를 발견했다. 링크
누군가 나에게 '왜?'인지에 대해 설명해줄 것이라고 믿으면서, 조금 더 관련 자료들을 찾아봐야겠다.
  • kkung at 2006.09.20 13:08

    왠지 그 누군가가 나는 아니길 생각해 보면서-_-;

    malloc(0) 는 꽤나 흥미로운 이슈가 아닐수 없는데
    (google: zero size malloc)

    수용군이 링크에서 건 대로 시스템 '구현'에 따라 다르다는 사실.

    그러나 그 군현은 크게 2가지
    1. zero size object
    2. null

    로 나누어 지는데

    zero size object는 읽기만 가능하고 쓰기는 불가능하고..
    뭐 대충 그런식 :)

    ..그리고 이 밑으로 zero size object에 대해 조낸 길게 썼는데 짤려서 슬프다. 삐져서 더 않쓸래-_ㅠ

  • 새벽놀 at 2006.09.20 15:55

    순전히 추측이지만,
    0의 공간을 할당했지만
    그 후에 대입한 2를 향한 공간을 할당한게 아닌가 싶은데 -_-..
    이런거 참ㅋㅋ

  • TayCleed at 2006.09.21 01:49

    아까 태형이랑 과방에서 int a[0]; 도 선언해서 써봤는데.
    166.104.144.50이랑, 과방 컴에 깔려있는 그, Bloodshed꺼 - _- 아 까먹었다. ;;

    sizeof 해보니까 0 나오는데
    int 값 대입이랑 읽어오기 다 잘~ 된다는거-

    ㄷㄷㄷ;

댓글 남기기
◀ PREV 1 NEXT ▶