[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
'C언어 > C언어 예제' 카테고리의 다른 글
[C언어 소스] atexit 함수 사용 예제 코드 (종료 핸들러 등록) (0) | 2016.05.05 |
---|---|
[C언어 소스] abort 함수 사용 예제 코드 (0) | 2016.05.05 |
[C언어 소스] malloc 함수 사용 예제 코드 (0) | 2016.05.04 |
[C언어 소스] free 함수 사용 예제 코드 (0) | 2016.05.04 |
[C언어 소스] calloc 함수 사용 예제 코드 (0) | 2016.05.04 |