realloc 함수

void *realloc(void *ptr, size_t size); 동적으로 메모리 할당

입력 매개 변수 리스트

ptr 기존에 동적으로 할당한 메모리 주소

size 새로 할당할 메모리 크기

반환 값

새로 할당한 메모리 주소

realloc 함수는 기존에 동적으로 할당했던 메모리를 새로운 크기로 재할당하는 함수입니다. 첫번째 인자로 0을 전달하면 malloc함수에 size를 전달한 것과 같습니다. 그렇지 않을 때는 반드시 동적으로 할당한 메모리 주소여야 합니다. realloc 함수는 새로운 메모리 크기 size만큼 메모리를 할당하고 기존에 할당했던 메모리의 내용은 새롭게 할당한 메모리에 복사해 줍니다. 만약 size가 기존에 할당한 메모리 크기보다 크면 차이가 있는 뒤쪽은 쓰레기 값(Gabage Value)가 남아있습니다.

사용 예

//C언어 표준 라이브러리 함수 가이드
//void *realloc(void *ptr, size_t size); 동적으로 메모리 할당
//확장 가능한 배열에 동적으로 생성한 Data 보관

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

typedef struct Data Data;
struct Data
{
    int num;
    char *name;
};
Data *NewData(int num, const char *name);//동적으로 Data 생성
void DeleteData(Data *data);//동적으로 생성한 Data 소멸
void DataView(Data *data);//Data 정보 보기

typedef struct Array Array;
struct Array
{
    Data **base;//버퍼 주소
    size_t size; //버퍼 크기(큐 용량)
    size_t count; //보관 개수    
};

Array *NewArray(void);//동적으로 확장 배열 생성
void ArrayPushBack(Array *arr, int num,const char *name);//확장 배열에 Data 보관
void ArrayView(Array *arr);//확장 배열의 정보 보기
void DeleteArray(Array *arr);//확장 배열 소멸

int main(void)
{    
    Array *arr = NewArray();//확장 배열 생성    
    ArrayView(arr);

    ArrayPushBack(arr,1, "홍길동");//확장 배열에 Data 보관
    ArrayView(arr);

    ArrayPushBack(arr,2, "강감찬");//확장 배열에 Data 보관
    ArrayView(arr);

    ArrayPushBack(arr,3, "을지문덕");//확장 배열에 Data 보관
    ArrayView(arr);

    ArrayPushBack(arr,4, "이순신");//확장 배열에 Data 보관
    ArrayView(arr);

    ArrayPushBack(arr,5, "한석봉");//확장 배열에 Data 보관
    ArrayView(arr);
        
    DeleteArray(arr);//확장 배열 소멸
    return 0;
}

Data *NewData(int num, const char *name)
{
    //구조체 Data 크기 1개를 동적으로 메모리 할당
    Data *data = (Data *)malloc(sizeof(Data));
    //입력받은 name 문자열 길이+1 크기 1개를 동적으로 메모리 할당
    data->name = (char *)malloc(strlen(name) + 1);
    //문자열 복사
    strcpy_s(data->name, strlen(name) + 1, name);
    data->num = num;//번호 설정
    return data;//동적으로 할당한 메모리 반환
}

void DeleteData(Data *data)
{
    //자신의 내부에 동적으로 생성한 메모리 해제 후에 자신을 해제합니다.
    free(data->name);//동적으로 할당한 name 메모리 해제
    free(data);//동적으로 할당한 data 메모리 해제
}

void DataView(Data *data)
{
    printf("이름:%-5s 번호:%d\n", data->name, data->num);
}

Array *NewArray(void)
{
    //구조체 Array 크기의 메모리 동적 할당
    Array *arr = (Array *)malloc(sizeof(Array));
    //Data * 크기 size 개를 동적으로 메모리 할당
    arr->base = (Data **)malloc(sizeof(Data *));
    arr->size = 1;//용량 설정
    arr->count=0;//보관 개수 설정
    
    return arr;//동적으로 생성한 queue 반환
}

void ArrayPushBack(Array *arr, int num,const char *name)
{
    if (arr->count == arr->size)//꽉찼을 때
    {
        arr->size *=2;
        arr->base = (Data **)realloc(arr->base,sizeof(Data *)*arr->size);
        
    }
    arr->base[arr->count] = NewData(num,name);//base의 rear 인덱스에 동적으로 생성한 data 보관    
    arr->count++;//보관 개수 1 증가    
}

void ArrayView(Array *arr)
{
    Data *data = NULL;
    int i = 0;

    printf("배열 저장소 용량:%d 보관 데이터 수:%d\n",arr->size,arr->count);
    for(i=0;i<arr->count;i++)
    {
        data = arr->base[i];//base의 i 인덱스에 원소를 data에 설정
        DataView(data);
    }
}

void DeleteArray(Array *arr)
{
    Data *data = NULL;
    int i = 0;

    for(i=0;i<arr->count;i++)
    {        
        data = arr->base[i];//base의 i 인덱스에 원소를 data에 설정
        DeleteData(data);//동적으로 생성한 data 소멸
    }
    free(arr->base);//동적으로 생성한 base 메모리 해제
    free(arr);//동적으로 생성한 queue 메모리 해제
}

출력

배열 저장소 용량:1 보관 데이터 수:0
배열 저장소 용량:1 보관 데이터 수:1
이름:홍길동 번호:1
배열 저장소 용량:2 보관 데이터 수:2
이름:홍길동 번호:1
이름:강감찬 번호:2
배열 저장소 용량:4 보관 데이터 수:3
이름:홍길동 번호:1
이름:강감찬 번호:2
이름:을지문덕 번호:3
배열 저장소 용량:4 보관 데이터 수:4
이름:홍길동 번호:1
이름:강감찬 번호:2
이름:을지문덕 번호:3
이름:이순신 번호:4
배열 저장소 용량:8 보관 데이터 수:5
이름:홍길동 번호:1
이름:강감찬 번호:2
이름:을지문덕 번호:3
이름:이순신 번호:4
이름:한석봉 번호:5