Friday, April 18, 2008

Memory, Allocation

메모리는 잘 알다시피 malloc(size_t size)로 할당하여 사용할 수 있다. C에서는 해당 포인터에 바로 대입할 수 있지만, C++에서는 void 포인터를 자동으로 캐스팅 해주지 않으므로 아래처럼 명시적으로 케스팅 해줘야 한다.

char * name;

name = (char *)malloc(512);

일부 프로그래머는 포인터를 리턴하는 함수 일부를 호출할 때 void로 변환하여(리턴값을 확인하지 않고) 쓰는데, 상당히 좋지 않은 습관이다.

malloc()은 NULL을 리턴할수 있기 때문에 에러체크를 꼭해줘야한다. 그래서 일반적으로 아래 처럼 wrapper를 둬서 사용한다.

void * xmalloc(size_t size)
{
void *p;
p = malloc(size);
if (!p) perror("xmalloc"), exit (EXIT_FAILURE);
return p;
}

배열을 할당할 때는 calloc()을 사용할 수 있는데, 이 함수는 값들을 0으로 초기화 해준다.

#include <stdlib.h>
void *calloc(size_t nr, size_t size);

nr x size 만큼의 공간을 할당해서 0으로 초기화 한 후 포인터를 돌려준다(이미 0으로 초기화된 메모리를 돌려주기 때문에 효율적이다). 이 함수를 사용해서 아래 처럼 0으로 초기화하는 malloc의 wrapper를 따로 두기도 한다.

void *xmalloc0(size_t size)
{
void *p;
p = calloc(1, size); // 1 x size
if (!p) perror("xmalloc0"), exit(EXIT_FAILURE);
return p;
}

No comments:

Post a Comment