본문 바로가기
STUDY/CODING

열혈 C : 문제 25-2 malloc, calloc, realloc 함수 이용하기

by 나비로이 2020. 3. 16.

-1를 입력할 때까지 정수 입력받은 후 출력

초기 배열길이: 5 / 꽉 찰때마다 3씩 추가

배열의 길이 모르기때문에 malloc 혹은 calloc 함수를 이용해야함.

마지막에 출력할 때, 값을 넣지 않은 인덱스값에 쓰레기값이 들어있는게 싫어서 나는 calloc함수를 이용했다.

(calloc -> 모든 비트 0으로 초기화 / malloc -> 쓰레기 값으로 초기화)

 

<내 풀이>

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i=0, num;
    typedef unsigned int usint;
    usint size = 5;
    
    int * ptr = (int *)calloc(size, sizeof(int));
    
    printf("정수입력: ");
    scanf("%d", &num);
    
    while(num!=-1)
    {
        if(i>=size)
        {
            size+=3;
            printf("size: %d \n",size);
            ptr = realloc(ptr, sizeof(int)*size);
        }
        ptr[i] = num;
        i++;
        
        printf("정수입력: ");
        scanf("%d", &num);
        
    }
    printf("배열 출력: ");
    for(i=0; i<=size; i++)
        printf("%d ", ptr[i]);
    free(ptr);
    
    return 0;
    
}

 

나는 예를들어 ptr[8]이고 6개의 값만 채워져있으면 마지막은 0으로 출력되도록 작성했다..

 

<답지 풀이>

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int arrlen = 5;
    int idx = 0;
    int i;
    int *arr = (int *)malloc(sizeof(int)*arrlen);
    
    while(1)
    {
        printf("정수입력: ");
        scanf("%d", &arr[idx]);
        if(arr[idx]==-1)
            break;
        
        if(arrlen==idx+1)
        {
            arrlen+=3;
            arr=(int *)realloc(arr, sizeof(int)*arrlen);
        }
        idx++;
    }
    for(i=0; i<idx; i++)
        printf("%d ", arr[i]);
    free(arr);
    return 0;
}

댓글