티스토리 뷰

c언어에서 sizeof 사용할 때 이거 하나는 알아두세요.

제가 오늘 실수한 내용 공유합니다. c언어에서 sizeof변수 타입의 메모리 바이트 크기를 구하고자 할 경우 주로 사용하는데요. sizeof(type) 이런식으로 씁니다. 다들 아는 얘기죠. 그러면 바이트 단위의 사이즈를 돌려줍니다. 가령 int a; result = sizeof(a); 라고 하면 result에는 보통 4라는 값이 들어갑니다.


int a[3]; result = sizeof(a); 라고 하면 result 변수에는 정수크기와 배열 크기의 곱에 해당 하는 4 * 3 = 12라는 값이 들어가게 되고요.

포인터를 사용하지 마세요

그런데 종종 실수 할 수 있는게 sizeof에 포인터를 쓸 때입니다. 저도 무심결에 실수했네요. 메모리를 malloc으로 잡아서 포인터로 참조해놓고 그걸 sizeof로 확인해버렸더니 항상 포인터 타입 크기로 반환해서 버그가 생겼네요... (ㅡ..ㅡ) 

int *a; result = sizeof(a); 라고 할 때 result는 4라고 포인터의 크기를 반환합니다. 그럼 int *a; a = malloc(12); result = sizeof(a); 이러한 구문에서 result는 어떤 값이 들어갈까요? 전 12가 들어가겠지 하고 무심결에 썼는데, 기대했던 12라는 값이 아니라 4가 들어갑니다.

조금만 생각하면 당연히 포인터 타입에 대한 크기가 들어가는 거죠. 포인터에 얼마의 메모리가 할당되어 있는지는 sizeof는 알 수 없으니까요.

void main()
{
    char *a;
    char result;

    // 10바이트 메모리 할당
    a = malloc(10);
    // a에 할당된 메모리 크기 구함.
    result = sizeof(a); 
    // result = 4 출력. char pointer size == 4
    printf("result = %d\n", result);
}

sizeof에 쓰면 안되는 타입

함수 타입, 불완전한 타입, 비트 필드는 sizeof에 쓰면 안됩니다. 포인터 쓸때는 유의해야 하는데 포인터는 포인터의 타입 크기를 반환합니다. 포인터가 참조하는 할당된 메모리 사이즈를 반환하지 않는다는걸 알아두세요~