• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

포인터 동적할당 sizeof()의 크기와 strlen()가 다른 부분

23.03.01 14:25 작성 23.03.01 14:25 수정 조회수 332

2

안녕하세요~ 강의 마지막 부분에 동적할당 관련하여 이해가 안되는 부분이 있어서 질문 드립니다.

sizeof(str5)의 경우 메모리 크기가 4이고 strlen(str5)인 경우 5로 나오는데요. "Hello"는 5byte이고 sizeof(str5)은 4byte인데 str5 변수에 "Hello"가 어떻게 들어갈 수 있는지 궁금합니다

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.03.01

안녕하세요, 답변 도우미 Soobak 입니다.

질문해주신 내용 잘 읽어보았습니다.
질문자님께서 지금 포인터 변수와 다른 일반 변수들의 차이점들에 대해 익숙하지 않으신 것 같아요.
저도 처음 C언어를 공부할 때 많이 혼동되었던 부분입니다.


강의에서 교수님께서 작성하신 코드들 중 질문자님이 질문해주신 부분을 발췌 해보았는데요.

char str1[100] = "Hello";
//...

char *str5 = (char*)malloc(sizeof(char * 100);
str5[0] = 'H; str5[1] = 'e'; str5[2] = 'l'; str5[3] = 'l'; str5[4] = 'o';
str5[5] = '\0';
printf("%zu %zu\n", sizeof(str5), strlen(str5));
  • 위 코드에서 char *str5포인터 타입의 변수로써, 메모리 주소 를 저장하는 변수입니다.

  • 교수님께서 강의 중에 언급해주신 내용처럼,
    포인터 타입의 변수는 메모리를 할당 받을 크기를 알 수 없기 때문에, 마치 주소를 적는 메모지의 크기처럼 메모리 주소의 크기 만을 알 수 있습니다.

  • 따라서, sizeof(str5) 의 결과 값 8byte 경우 할당된 메모리의 크기가 아닌, 메모리 주소의 크기인 것입니다.

    • 포인터 변수가 저장하는 메모리 주소의 크기는 운영체제와 컴퓨터 아키텍처에 따라 달라지기도 하는데요. 예를 들어 32비트 아키텍처에서는 4바이트 크기의 데이터 타입을 사용하여 메모리 주소를 저장하고, 64비트 아키텍처에서는 8바이트 크기의 데이터 타입을 사용하여 메모리 주소를 저장합니다.

  • 이 때, 포인터 타입의 변수인 str5 에 할당된 메모리의 크기는,

    위 코드에서 char str5 = (char*)malloc(sizeof(char * 100); 부분과 관련이 있는데요.

    해당 코드는 char 형 데이터를 100개의 크기만큼 동적으로 메모리를 할당하는 것을 의미합니다.

  • 따라서, "Hello\0" 의 6바이트 크기 데이터를 저장하기에 충분한 메모리 이므로, str5 변수에 "Hello\0" 데이터가 저장될 수 있습니다.


    추가적으로, 포인터 타입의 변수에 대해서는 저 또한 많이 혼란스러워 했던 부분이며,
    교수님께서 강의 전반에 걸쳐서 틈틈히, 그리고 9.12 포인터의 작동 원리 강의 이후부터는 더 자세히 설명해주시므로 지금 시점에서 이해가 되지 않으셔도 전혀 걱정하실 필요가 전혀 없을 것 같아요!
    그럼에도 불구하고, 질문 남겨주셔서 감사드립니다.

    추가적으로, "메모리 할당", "컴파일 타임", "런 타임", "포인터 변수" 등의 키워드로 검색하여 학습해보시면 더 도움이 되실 것 같아요.

    또 궁금하신 점 있으시면 편하게 질문 주시면 감사하겠습니다. 화이팅!