지난 시간에 포인트변수 생성 malloc()함수와 소멸 free()함수에 대해서 살펴 보았습니다. 오늘은 추가로 포인트변수 생성 함수인 calloc()함수와 realloc()함수에 대해 알아보도록 하겠습니다.
포인트 배열변수는 다음과 같이 선언할 수 있습니다.
int *arr_p=(int*)malloc(sizeof(int)*3);
or
int *arr_p;
arr_p=(int*)malloc(sizeof(int)*3);
하나의 포인트 변수는 아래와 같이 선언합니다.
int *arr_p=(int*)malloc(sizeof(int));
여기에 배열 포인트 변수는
sizeof(int)*배열수
이렇게 범위를 지정할 수 있습니다. malloc()함수는 방금 위처럼 표현하지만 동일한 calloc()함수는 좀 다르게 포인트 변수를 생성합니다.
**malloc(자료형크기*배열수)**
**calloc( 배열수,자료형크기 )**
calloc()함수는 배열수와 자료형크기로 두 인자를 받도록 되어 있습니다. malloc()함수와 calloc()함수를 보시고 잘 구분해 주세요. 배열수를 곱해주나 아니면 따로 인자로 넘겨주냐의 차이점만 구분하시면 됩니다.
그래서, calloc()함수로 다시 배열 포인트 변수를 선언하면 다음과 같습니다.
int *arr_p=(int*)calloc(3,sizeof(int));
이렇게 함으로써 arr_p[3]배열 변수로 3개의 값을 저장할 수 있는 배열 변수를 생성하게 되었습니다.
그럼 테스트 해봐야겠죠.
#include
#include
int main(int argc, char *argv[]) {
//int *arr_p=(int*)malloc(sizeof(int)*3);
int *arr_p=(int*)calloc(3,sizeof(int)); //포인트배열변수 생성
for(i=0;i<3;i++){
arr_p[i]=i;
}
for(i=0;i<3;i++){
printf("주소 : %x 값 : %d \n",&arr_p[i],arr_p[i]);
}
free(arr_p); //포인트배열변수 소멸
return 0;
}
[결과]
결과를 보시면 주소 번지의 자료형 크기로 일렬로 끝자리 0,4,8로 나온 걸 보실 수 있을 거에요. int형의 자료형 크기로 3개의 배열수를 만들었고 각 주소지에 3개의 값을 저장고 그 저장된 값을 출력해 보았습니다.
malloc()함수로 표현으로 해도 같은 결과 입니다. 사용하기 편한 걸 사용하셔서 코딩하시면 됩니다.
ralloc()함수는 재할당 함수입니다. 기존에 할당된 포인트 배열변수를 다시 재할당(재정의) 한다고 생각하시면 됩니다.
배열 포인트 변수가 다음과 같이 arr_p[3]으로 선언되었다고 가정 합시다.
int *arr_p=(int*)malloc(sizeof(int)*3);
arr_p[6]으로 재정의 하고자 할 때 realloc()함수를 사용합니다.
realloc(arr_p,sizeof(int)*6);
이렇게 말이죠. 그러면 정확히 어떤 변화가 있는지 코딩해서 실행해 봐야 겠죠.
[소스]
#include
#include
int main(int argc, char *argv[]) {
int *arr_p=(int*)malloc(sizeof(int)*3);
int i;
for(i=0;i<3;i++){
arr_p[i]=i;
}
for(i=0;i<3;i++){
printf("주소 : %x 값 : %d \n",&arr_p[i],arr_p[i]);
}
printf("재할당 realloc() 처리\n");
realloc(arr_p,sizeof(int)*6);
for(i=0;i<6;i++){
arr_p[i]=i;
}
for(i=0;i<6;i++){
printf("주소 : %x 값 : %d \n",&arr_p[i],arr_p[i]);
}
free(arr_p);
return 0;
}
[결과]
결과를 보시면 3개의 배열이 6개의 배열로 늘어난 것을 보실 거에요. 이렇게 포인트 배열 변수로 특정 크기로 생성했을 때 realloc()함수를 이용하여 기존의 포인트 배열 변수를 수정할 수 있는 유용한 함수입니다. 상황에 맞게 크기를 수정할 수 있는 장점이 있습니다.
오늘은 지난 시간에 설명하지 않은 두개의 함수 할당(calloc())과 재할당(realloc())함수에 대해 이야기 했네요. 할당함수로 malloc()함수를 사용하시든 calloc()함수를 사용하시는 코딩하시는 분의 맘이고 realloc()함수로 기존의 포인트 배열변수를 재정의하여 크기를 원하는 형태로 자유자재로 변경 할 수 있는 유용한 함수이기 때문에 알아두시면 좋습니다.
오늘은 설명이 길어져서 좀 더 post 할 내용이 있었는데 다음으로 미뤄야 겠군요.