-1이 입력될때 까지 숫자를 입력받고, free함수를 통해 메모리공간을 비우기 전 입력받은 수를 차례로 출력하여라. 단 int 형 배열의 크기는 5(sizeof(int) == 4bytes x 5)로 잡고 부족할시 3만큼 증가시켜라.
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int * numberings(); // 함수 선언
int number=0; // 전역변수 number선언 -> 쌓인 숫자의 개수파악 목적
int main()
{
int i;
int * nptr;
nptr = numberings(); // 힙공간, 수들이 입력된 숫자 배열의 첫메모리 주소값으로 초기화
printf("Entered numbers so far(in order)\n");
for(i=0 ; i < number ; i++)
{
printf("%d ", nptr[i]);
}
free(nptr); // free
return 0;
}
int * numberings() //함수 생성
{
int i=0;
int size=5; // 최초 크기
/* int 타입 공간(4바이트)을 5개 만든다 -> 총 20바이트의 공간 할당
calloc은 인자를 이런식으로 2개 받는다.
*/
int * nptr = (int *)calloc(sizeof(int),size);
/*malloc은 메모리공간 할당시 default상태에서 각 비트에 쓰레기값을 할당하지만
calloc의 경우 default로 각 비트의 값이 0이다. 이를 활용할 예정*/
while(1) // 최초진입 가능, 무한 루프
{
printf("수를 입력하시오 : ");
scanf("%d", & nptr[i]); // 배열 성분 입력
if(nptr[i]==-1) // -1 입력시 반복문 탈출.
{
break;
}
if(nptr[size-1] !=0) // 할당된 공간의 모든 값이 초기화 되면..
/*nptr의 사이즈가 10이라면 마지막 배열값은 nptr[9].
따라서 마지막 배열값이 0이 아닌 다른수로 초기화되어 배열이 포화상태가 된다면 ...
*/
{
nptr = (int * )realloc(nptr, sizeof(int)*(size + 3));
/* realloc을 통해 기존 nptr의 사이즈를 재조정한다.
(반환형)realloc(인자1 : 기존포인터, 인자2 : 재조정할 공간의 길이 -> 기존 + 3)
*/
}
i++;
number++; // 총 입력되는 숫자의 수
}
return nptr;
}
calloc을 통한 동적할당은 최초 비트를 0으로 초기화한다는 장점이 있다. 또한 realloc을 통해 배열의 공간(길이)가 부족하다면 얼마든지 재조정할 수 있다. C언어 뿐 아니라 C++에서도 동적할당과 관련한 표준함수를 제공하고 있으니 추후 살펴보도록 하자.