문제상황

Untitled

unsigned char* ptr = (unsigned char *)malloc(512 * 512 * 3); //출력: 8

512 * 512 * 8의 길이를 가진 배열을 선언하고 sizeof로 확인해보았더니 길이가 8이라고 나오게 되었다.

문제 해결

How to find the size of an array (from a pointer pointing to the first element array)?

우리는 이 포인터로 배열을 동적 할당하였다는 것을 안다. 그렇기에 sizeof로 확인하면 동적할당한 만큼의 배열 길이가 나올 것이라 생각한다. 재밌게도 컴파일러는 우리가 생각한 대로 컴파일 해주지 않는다.

컴파일러는 포인터로 동적할당된 배열의 존재를 모른다. 즉, 포인터가 가지키고 있는 주소에 무엇이 있는지도 모른다. 이러한 트릭으로 인해 우리가 생각한대로 sizeof가 동작하지 않는 것이다.

결국 sizeof(ptr)를 하게 되는 경우, return값으로 (변수 ptr의 size_t) + (sizeof(ptr)의 값)이 반환이 된다.

예)

int *ptr = (int *)malloc(40* sizeof(int));

print(sizeof(ptr); //output = 8
//becuase ptr's size_t is 4(int), sizeof(ptr) is 4(int), so the output is 8.