해결된 질문
작성
·
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()
호출이 실패했을 경우 기존에 할당되었던 메모리는 그대로 유지됩니다.이 내용이 맞는 건가요?