포인터와 함께 sizeof()를 사용할 때 흔히 발생하는 함정
2895 단어 cppprogrammingclangpointers
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
가 배열에 할당된 바이트 크기를 가져올 수 있는 이유 중 하나일 수 있는 힙이 아닌 스택에 할당됩니다.❤️잘 읽어주셔서 정말 감사합니다. 틀린 부분이 있으면 댓글로 알려주세요.
이 게시물이 어떤 식으로든 도움이 된다면 공유하고 엄지손가락을 치켜세우는 것도 고려해 보세요.
Reference
이 문제에 관하여(포인터와 함께 sizeof()를 사용할 때 흔히 발생하는 함정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/namantam1/a-comman-pitfall-when-using-sizof-with-pointers-16ap텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)