포인터와 함께 sizeof()를 사용할 때 흔히 발생하는 함정

신입생이 할당된 바이트 수를 얻기 위해 포인터와 함께 sizeof 연산자를 사용할 때 흔히 저지르는 실수가 있습니다.

NOTE: sizeof returns the size in bytes and 1 byte = 8 bit



#include <stdio.h>
#include <stdlib.h>

int main() {
    char *c = malloc(10);

    printf("Bytes allocated: %ld\n", sizeof(c));
    return 0;
}


그들은 위 프로그램의 출력을 10바이트로 기대합니다. 그러나 그렇게 작동하지 않습니다.

출력은

Bytes allocated: 8


하지만 왜? 10바이트를 할당하면 10바이트가 출력되어야 합니다. 왜 8바이트가 표시됩니까?

그러면 이 질문에 대한 대답은 위의 코드에서 할당된 바이트의 양을 측정하는 것이 아니라 모든 64비트 컴파일러의 경우 8바이트, 32비트 컴파일러의 경우 4바이트인 포인터의 크기를 측정하는 것입니다. (제 컴파일러는 64비트입니다)

따라서 나중에 가져오려면 일부 변수에 명시적으로 저장해야 합니다.

이제 포인터처럼 동작하는 배열에 대해 동일한 작업을 수행할 수 있는 방법에 대한 질문입니다.

아래 예시를 확인해보자.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int c[10];

    printf("Bytes allocated: %ld\n", sizeof(c));
    return 0;
}


산출

Bytes allocated: 40


int의 크기가 4바이트이므로 총 4x10 = 40바이트가 반환되기 때문에 위 프로그램의 출력은 예상대로입니다.

위의 문장에서 배열이 포인터처럼 동작한다고 말했지만 그렇지 않습니다. sizeof가 배열에 할당된 바이트 크기를 가져올 수 있는 이유 중 하나일 수 있는 힙이 아닌 스택에 할당됩니다.


❤️잘 읽어주셔서 정말 감사합니다. 틀린 부분이 있으면 댓글로 알려주세요.

이 게시물이 어떤 식으로든 도움이 된다면 공유하고 엄지손가락을 치켜세우는 것도 고려해 보세요.

좋은 웹페이지 즐겨찾기