반응형
realooc
헤더 파일
입력 매개 변수 리스트
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
사용한 함수
[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - malloc
[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - strlen
[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - strcpy_s
[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - printf
[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - free
관련 함수
반응형
'언어 자료구조 알고리즘 > C11 표준 라이브러리 함수' 카테고리의 다른 글
system 함수 [C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
---|---|
getenv 함수 [C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
exit 함수 [C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
atexit 함수 [C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
abort 함수[C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
malloc 함수 [C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
free 함수 [C언어 표준 라이브러리 함수 사용법 가이드] (0) | 2016.01.03 |
calloc 함수 [C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
srand 함수 [C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
rand 함수 [C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |