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

용개형멋져님의 프로필 이미지
용개형멋져

작성한 질문수

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

12.16 calloc(), realloc()

realloc() 함수 질문이 있습니다.

해결된 질문

작성

·

213

2

int* ptr = NULL;

ptr = (int*)calloc(n, sizeof(int)); // contiguous allocation

 

if (!ptr)

exit(1);

 

for (int i = 0; i < n; ++i)

printf("%d ", ptr[i]);

printf("\n");

 

for (int i = 0; i < n; ++i)

ptr[i] = i + 1;

 

n = 20;

 

int* ptr2 = NULL;

ptr2 = (int*)realloc(ptr, n * sizeof(int));

 

realloc() 함수에서 메모리를 새로 할당 해줄 수 없을 경우 NULL 값을 반환해준다고 했는데

그 때 원래 있던 ptr은 어떻게 되는 건가요? 그대로 남아있는 건가요 아니면 free를 한 상태가 되는 것 인가요?

realloc() 함수는 원래 있던 포인터에 대한 할당 받은 메모리 공간은 free를 한 상태로 바꿔준다고 했는데

이렇게 NULL 값을 반환해 줄 때도 원래 있던 메모리 공간을 free한 상태로 바꿔주는 건지 궁금해서요

 

항상 좋은 답변 감사합니다.

답변 2

2

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

 

realloc() 함수가 메모리를 새로 할당하는 데 실패할 경우, 원래의 메모리 블록은 변경되지 않고 그대로 유지됩니다.
즉, 원래의 포인터(ptr)는 여전히 유효하고 접근 가능한 상태로 남아있습니다.

따라서, realloc() 함수가 실패했을 경우(NULL 을 반환하는 경우), 명시적으로 메모리 블록을 해제해주어야 합니다.
다만, realloc() 함수가 성공적으로 메모리를 새로 할당했을 경우, 기존의 포인터는 realloc() 함수 내부에서 해제되므로 명시적으로 해제해줄 필요는 없습니다.

0

안녕하세요, 인프런 AI 인턴입니다.

용개형멋져님의 realloc() 함수 관련 질문은, realloc() 함수가 새로운 메모리 할당에 실패했을 때, 기존에 할당받았던 메모리 공간의 상태가 어떻게 되는지에 대한 것입니다. 이는 C 프로그래밍에서 중요한 개념 중 하나이며, 정확히 이해하면 메모리 관리에 큰 도움이 됩니다.

다행히도, 같은 강사님이 답변해 주신 다른 학생의 질문에 realloc() 함수의 동작 원리를 설명한 내용이 있어, 이를 참고하시면 질문에 대한 답을 얻을 수 있을 것 같습니다.

free()함수의 정확한 용법 ( realloc함수와 free함수의 관계) - 홍정모 지식공유자님께서 잘 설명해 주셨습니다. 이 답변에 따르면 realloc() 함수는 새로운 메모리 공간을 할당하는데 성공하면 그 주소를 반환하고 기존 메모리를 해제(free)하지만, 할당에 실패하면 NULL을 반환하고 기존 메모리는 해제하지 않는다고 합니다. 즉, realloc() 호출이 실패했을 경우 기존에 할당되었던 메모리는 그대로 유지됩니다.

지식공유자님께서는 realloc()의 동작 방식에 대해 다음과 같이 설명해 주셨습니다:

realloc()은 강의에서 설명을 드렸을 텐데 내부적으로 free()를 할 수도 있고 하지 않을 수도 있습니다. 이것도 결국 운영체제가 판단하는 것이기 때문에 프로그래밍 문법 차원에서 어떤 상황에서 결과가 어떻게 되어야 한다고 강제할 수 없습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이 답변에 따르면 realloc() 함수는 새로운 메모리 공간을 할당하는데 성공하면 그 주소를 반환하고 기존 메모리를 해제(free)하지만, 할당에 실패하면 NULL을 반환하고 기존 메모리는 해제하지 않는다고 합니다. 즉, realloc() 호출이 실패했을 경우 기존에 할당되었던 메모리는 그대로 유지됩니다.

이 내용이 맞는 건가요?

용개형멋져님의 프로필 이미지
용개형멋져

작성한 질문수

질문하기