ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ realloc(3)
    C,C++ & Linux 2020. 5. 22. 19:02
    728x90

    함수 기능

    힙 메모리를 할당하는 함수입니다.

     

    Linux / Unix는 가용한 힙 메모리를 자유 공간 블럭(free memory block)의 리스트로 관리합니다. 이를 자유 공간 풀(free memory pool)이라고도 부르는데 malloc() 계열의 함수를 호출하게되면 이 리스트를 정해진 알고리즘으로 탐색하여 적절한 크기를 가진 메모리를 찾고 해당 메모리의 주소를 리턴하는 것입니다.

     

    힙 메모리에 할당 받은 메모리는 함수가 끝나더라도 할당 해제 되지 않으므로 적절한 시점에 free() 하여 메모리 누수가 생기는 것을 방지해야합니다.

    함수 원형

    #include <stdlib.h>
    
    void *realloc(void *ptr, size_t newsize);

     

    매개변수

    ptr

    재할당 하고자 하는 메모리의 포인터

     

    newsize

    새롭게 할당받고자 하는 메모리의 크기. 추가하거나 삭제할 크기가 아닌 새롭게 할당받고자 하는 크기를 온전히 넣어줘야합니다.

    예를 들어 4바이트 포인터를 6바이트로 늘리고자 한다면 2가 아닌 6을 넣어줘야합니다.

     

    반환값

    성공 시 할당 받은 메모리를 가리키는 포인터

    에러 시 NULL 리턴

     

    지정한 메모리 뒷 부분이 가용 메모리라서 덧붙일 수 있는 경우에는 덧붙여서 할당하여 리턴해줍니다.

    하지만 그렇지 않은 경우 새로운 메모리를 찾아서 할당하고 기존의 내용을 복사해서 리턴합니다.

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[]) {
        int *arr;
    	
    	// sizeof(int) = 4
    	// 4 * 4 = 16 바이트 할당 요청
        arr = (int *) calloc(4, sizeof(int));
    
        for (int i = 0; i < 4; i++) {
            arr[i] = i;
            printf("%d\n", arr[i]);
        }
    
        printf("realloc\n");
        arr = (int *) realloc(arr, sizeof(int) * 10);
        for (int i = 0; i < 10; i++) {
            arr[i] = i;
            printf("%d\n", arr[i]);
        }
        exit(0);
    }
    

     

    결과

     

     

     

     

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ getenv(3)  (0) 2020.05.22
    C/C++ free(3)  (0) 2020.05.22
    C/C++ calloc(3)  (0) 2020.05.22
    C/C++ malloc(3)  (0) 2020.05.22
    C/C++ atexit(3), on_exit(3)  (0) 2020.05.22

    댓글

Designed by Tistory.