C언어/C언어 예제

[C언어 소스] realloc 함수 사용 예제 코드

언제나휴일 2016. 5. 4. 23:32
반응형

[C언어 소스] realloc 함수 사용 예제 코드


//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



언제나 휴일 티스토리 바로가기

언제나 휴일 유튜브 채널 바로가

 

반응형