realloc(3)

#include <stdlib.h>

void *realloc(void *ptr, size_t size);

malloc(3) / calloc(3) / realloc(3)으로 할당된 메모리의 크기를 재할당합니다. 기할당된 메모리(ptr)에 쓰여진 데이터는 재할당된 메모리 영역에 복제를 하고, 기존에 할당된 영역은 free(3)합니다. 또한 추가로 할당된 영역은 초기화되지 않습니다.

 

ptr이 NULL이면 malloc()함수와 같이 동작합니다.

size가 0이고 ptr이 NULL이 아니면 free(ptr)을 한 것과 같습니다.

 

 

파라미터

ptr
    - malloc(3), calloc(3), realloc(3)으로 할당한 heap memory pointer
      ptr이 NULL이면 malloc(3)함수 같습니다.
size
    - 재할당하려는 크기(byte수)
      size가 0이면 free(3)함수와 같습니다.

 

RETURN

NULL
    -  memory 재할당에 실패하였습니다.

NULL이 아닌 경우
    - 정상적으로 메모리가 재할당되었습니다.
     return type이 void *이므로 적절한 type casting을 하여 pointer 변수에 대입해야 합니다.
     대체로 ptr 변수에 다시 대입합니다.

 


활용 예제

 

Sample

#include <stdio.h>
#include <stdlib.h>

......

int main(int argc, char *argv[])
{
    int *ptr;
    int  size = 10000;

    ......

    /* memory를 할당합니다. */
    if((ptr = (int *)malloc(size) == NULL) {
        fprintf(stderr, "malloc error.\n");
        return 1;
    }

    ......

    /* 만약 크기를 더 늘려야 하는 경우 */
    size += 10000;
    if((ptr = (int *)realloc(ptr, size)) == NULL) {
        fprintf(stderr, "realloc error.\n");
        return 1;
    }

    ......	

    /* memory를 해제합니다. */
    free(ptr);

    /* 
      free후에는 될 수 있으면 NULL을 대입하여 혹시라도 두 번 free하는 것을 방지하는 것이 좋습니다. 
      free한 메모리에 대해서 또 free하게 되면 coredump 비정상 종료될 수 있습니다.
    */
    ptr = NULL;

    return 0;
}

 


see also : memory 관련 함수

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요

  • ㅇㅇ 2019.11.14 00:22  댓글주소  수정/삭제  댓글쓰기

    만약 malloc으로 할당한 메모리를 free로 해제하고 다른 포인터에 malloc으로 메모리를 할당하는 상황이면, 이 경우에는 free된 메모리가 아닌 새로운 메모리에 기입하게 되는 것인가요?

  • 사용자 자연&사람 2019.11.14 07:09 신고  댓글주소  수정/삭제  댓글쓰기

    OS의 메모리 할당 알고리즘 영역이라 정확하게 얘기하기 어려우나 Heap 메모리는 메모리 번지가 낮은 부분 부터 찾아서 할당하려는 크기의 공간이 연속적으로 존재하면 그곳을 할당하는 것으로 알고 있습니다. 같은 위치가 될 수도 아닐 수도 있습니다. 우리가 호출한 함수 내에서 우리가 모르는 heap 메모리 할당이 일어날 수 있기 때문에 알 수 없는 것입니다.

  • ㅇㅇ 2019.11.15 11:07  댓글주소  수정/삭제  댓글쓰기

    아 그렇군요... 감사합니다