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

강진성님의 프로필 이미지
강진성

작성한 질문수

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

12.16 calloc(), realloc()

realloc() 함수에 대한 질문...

작성

·

120

1

ptr2 = (int*)realloc(ptr, n * sizeof(int)); 부분에서 ptr2에 새롭게 할당된 메모리의 대표 주소가 리턴되는것은 이해햇습니다만, 그럼 원래 ptr이 가리키고 있던 메모리는 어떻게 되는 건가요?? 그냥 남아있는건지 궁금합니다.

답변 2

1

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

 

아주 좋은 궁금증이시네요.

시스템의 메모리 할당 방식에 따라서 다르게 작동할 수 있지만,

realloc() 함수의 동작 방식은 기본적으로 다음 두 가지 경우로 나누어 살펴볼 수 있습니다.

 

  • 메모리 블록이 확장 가능한 경우
    : 만약, 기존 메모리 블록이 확장 가능한 경우 (기존 메모리 블록의 바로 뒤에 충분한 연속적인 메모리 공간이 있다면), realloc() 함수는 기존 블록의 주소를 그대로 반환합니다. 이 경우 기존의 ptr 이 가리키던 메모리 블록이 확장되어 그대로 사용됩니다.

 

  • 새로운 메모리 블록 할당이 필요한 경우
    : 기존 메모리 블록이 확장 불가능한 경우, realloc() 함수는 새로운 크기의 메모리 블록을 할당하고, 기존 메모리 블록의 데이터를 새로운 블록으로 복사한 후, 기존 메모리 블록을 free() 하여 해제해줍니다.
    이 경우, 원래 ptr 이 가리키고 있던 메모리 주소는 더 이상 유효하지 않습니다.

 

즉, 성공적으로 기존 블록이 확장된 경우에는 원래 ptr 이 가리키던 메모리 블록이 확장되어 그대로 사용됩니다.
반면, 확장되지 못하는 상황으로 새로운 블록이 할당되는 경우 기존 ptr 이 가리키던 메모리 블록은 해제됩니다.

 

이해를 돕기 위하여 한 번 컴파일 후 실행해보시면 도움이 되실 코드와 실행 결과 사진을 첨부드립니다.

int main()
{
  int* ptr1 = (int*)malloc(sizeof(int));
  *ptr1 = 10;

  printf("ptr1 값[%d]\n", *ptr1);
  int* ptr2 = (int*)realloc(ptr1, sizeof(int)); // realloc 을 같은 크기로 호출
  *ptr2 = 20;

  printf("ptr1 주소[%p]    ptr2 주소[%p] --- 같은 주소\n", ptr1, ptr2);
  printf("ptr2 값[%d]\n", *ptr1);

  printf("ptr2 주소[%p]", ptr2);
  int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 10); // realloc 을 보다 큰 크기로 호출
  *ptr3 = 30;

  printf("    ptr3 주소[%p] --- 달라진 주소\n", ptr3);
  printf("ptr3 값[%d]\n", *ptr3);

  return 0;
}

 

실행 결과

image

강진성님의 프로필 이미지
강진성
질문자

감사합니다!! 완전 이해했어요

0

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

강진성님의 질문에 대해 연관된 내용을 담은 유사한 질문의 답변을 찾았습니다. “free()함수의 정확한 용법 ( realloc함수와 free함수의 관계)” 라는 제목의 게시글에서, realloc 함수와 free 함수의 관계에 대해 설명하고 있습니다.

요약된 내용:
realloc 함수는 이미 할당된 메모리의 크기를 조정하는 함수로, 새로운 메모리 블록을 할당하고 기존 데이터를 새로운 메모리 블록으로 복사한 뒤, 기존 메모리 블록을 해제(free)합니다. 만약 새로운 메모리 할당에 실패한다면, 원래 메모리는 그대로 남아있고 NULL을 반환합니다. realloc 함수는 기존 메모리를 해제하는 과정을 내부적으로 처리하기 때문에 별도로 free를 호출할 필요는 없습니다. 단, realloc 이후에는 원래의 포인터(ptr) 사용을 피해야 하며, realloc이 성공적으로 수행되었다면 새로운 주소값이 들어있는 포인터(예: ptr2)만을 사용해야 합니다.

결국, ptr이 가리키고 있던 원래의 메모리는 realloc에 의해 새로운 메모리로 데이터가 복사되고 나서 해제되므로, 직접적으로 접근해서는 안 됩니다. 이는 잘못된 접근으로 이어질 수 있으멀로 주의해야 합니다.

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

강진성님의 프로필 이미지
강진성

작성한 질문수

질문하기