인프런 커뮤니티 질문&답변

조준수님의 프로필 이미지
조준수

작성한 질문수

홍정모의 따라하며 배우는 C언어

12.16 calloc(), realloc()

calloc() 질문입니다

작성

·

323

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키
강의에서 calloc() 함수는 할당시 할당된 요소들의 값을 모두 0으로 초기화 한다고 했잖아요. 근데 실제로 실행해보니 모두 0으로 초기화가 되지 않네요. 왜이런걸까요?

답변 1

0

초기화는 잘 된겁니다. 근데 문제가 있습니다!

질문자님께서 작성한 코드 보면 malloc 과 calloc 에게 n 을 파라미터로 넘겨주고 있는데

malloc 과 calloc 에게 이 사이즈만큼 할당해줘 하고 파라미터를 넘겨줄 땐 byte 단위로 넘겨줍니다.

즉, 질문자님께선 10 인 n 을 넘기셨으니 10byte 의 크기를 동적할당 받으신 것입니다.

10 개의 int 를 할당받기 위해 10 을 넘겨주신 것 같은데 이렇게 하면 안되고 sizeof(int) * 10  즉, 40 을 넘겼어야 합니다.

ptr2 는 10byte 크기의 메모리를 가리키고 있는 것이 되었구요, 

게다가 calloc (1, 10) 으로 하셨는데 calloc 은 첫번째 파라미터는 갯수, 두번째 파라미터는 타입의 크기를 넘겨야 하는 함수입니다. 그렇기 때문에 int 가 10개 들어갈 수 있는 메모리를 만드려면 calloc (10, 4 ) 혹은 calloc (10, sizeof(int)) 로 호출하셨어야 합니다. 질문자님께서 작성하신 calloc (1, 10) 는 10 byte 를 1 개 할당해달라 하는거나 마찬가지입니다.

따라서 ptr2 는 10byte 크기의 메모리를 가리키고 있는건데  질문자님 코드는 for문을 10번 돌면서  포인터 산술연산을 하고 있습니다. 즉, int 가리키는 포인터이기 때문에 주소값이 4 씩 차이가 나게끔 산술연산이 될 것입니다.

그렇기 때문에 사실상 for문으로 calloc 으로부터 받은 메모리를 도는건 2번 정도밖에 안되는거에요. 10byte 로 할당받았었는데 4byte 단위로 산술연산 하니까요 

10번 도는 for문이기 떄문에 주소값이 최대 40 까지 더해지는데 calloc (1, 10)로 작성하셨기에, 막상 calloc 으로 할당한 메모리는 크기가 10byte 밖에 안되기 떄문입니다.  (주소 1당 메모리 크기 1byte 입니다.)

10byte 크기의 메모리는 0 으로 다 초기화가 된 상태입니다. 질문자님 출력 결과 보시면 두번째까진 0 으로 잘 나옵니다. 그 이후에 출력된 부분들은 calloc 이 할당한 메모리 영역이 아니기에 쓰레기값인 셈입니다. 

조준수님의 프로필 이미지
조준수

작성한 질문수

질문하기