C.5-3 동적할당 malloc / free

lsw·2021년 3월 24일
0

C

목록 보기
8/9
post-thumbnail

1. 문제

-1이 입력될때 까지 숫자를 입력받고, free함수를 통해 메모리공간을 비우기 전 입력받은 수를 차례로 출력하여라. 단 int 형 배열의 크기는 5(sizeof(int) == 4bytes x 5)로 잡고 부족할시 3만큼 증가시켜라.


2. 코드

#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;  
}

3. 결과


4. 결론

calloc을 통한 동적할당은 최초 비트를 0으로 초기화한다는 장점이 있다. 또한 realloc을 통해 배열의 공간(길이)가 부족하다면 얼마든지 재조정할 수 있다. C언어 뿐 아니라 C++에서도 동적할당과 관련한 표준함수를 제공하고 있으니 추후 살펴보도록 하자.

profile
미생 개발자

0개의 댓글