#include <stdlib.h>
void* malloc(size_t size)
#include <stdlib.h>
void *calloc(size_t num, size_t size)
int *x = malloc(10 * sizeof(int));
printf(“%d\n”, sizeof(x));
4
int x[10];
printf(“%d\n”, sizeof(x));
40
위에선 x를 동적할당하고 있기 때문에 40byte가 run-time에 할당된다. 따라서 sizeof(x)의 결과는 단순히 pointer변수의 크기인 4byte가 출력된다.
아래에서는 x를 정적할당하였기 때문에 40byte가 compile-time에 할당된다. 따라서 40이 출력된다.
#include <stdlib.h>
void free(void* ptr)
char *src = “hello”; //character string constant
char *dst; //unallocated
strcpy(dst, src); //segfault and die
위의 코드에서 문자열 상수인 "Hello"는 code 영역에 할당된다.
dst에는 쓰레기값이 들어있고 그 위치는 할당된 공간이 아니기 때문에 strcpy에서 segfault error가 생긴다.
char *src = “hello”; //character string constant
char *dst = (char *)malloc(strlen(src) + 1); //allocated
strcpy(dst, src); //work properly
따라서 dst를 선언하면서 src의 크기만큼 memory를 할당해주면 해결된다.
char *src = “hello”; //character string constant
char *dst (char *)malloc(strlen(src)); // too small
strcpy(dst, src); //work properly
strcpy는 src에서 NULL문자가 등장할 때까지 순차적으로 복사한다.
위의 코드에서는 dst가 src의 크기보다 1byte 작게 할당되었기 때문에 NULL문자는 할당되지 않는 공간에 복사되는 문제가 생긴다. 그러나 아래 2가지 이유로 위의 코드는 정상적으로 작동할 것이다.
1. 사실 malloc으로 공간할당을 할 때 주어진 size보다 크게 할당하기 때문에 segfault가 발생하지 않는다.
2. NULL문자가 복사되는 공간이 우연히 다른 malloc 함수에 의해 할당된 공간일 수도 있다.
int *x = (int *)malloc(sizeof(int)); // allocated
int *y = (int *)malloc(sizeof(int) * 200); // allocated
// *x = 4;
// memset(y, 0, sizeof(int) * 200)
printf(“*x = %d\n”, *x); // uninitialized memory access
초기화를 해주지 않아 쓰레기값이 출력된다.
초기화 방법으로 위의 주석처리된 2가지 방법이 있다.
x처럼 간단한 경우를 제외하고 memset이라는 함수를 사용할 수 있는데
memset의 첫 번째 인자는 주소값, 두 번째 인자는 초기화하려는 값, 마지막 인자는 memory size이다.
int *x = (int *)malloc(sizeof(int)); // allocated
free(x); // free memory
free(x); // free repeatedly
#include <unistd.h>
int brk(void *addr)
void *sbrk(intptr_t increment);