본문 바로가기
개념/혼자 공부하는 C언어

chapter 16) calloc, realloc 함수를 사용한 양수 입력

by kiseno 2024. 9. 19.
728x90
반응형
SMALL
#include <stdio.h>
#include <stdlib.h>

int main(void){
    int *pi, size=5, count=0,num,i;
    pi = (int *)malloc(sizeof(int));
    while(1){
        printf("write in nature number : ");
        scanf("%d", &num);
        if(num <= 0) break;
        if(count == size){
            size += 5;
            pi = (int *)realloc(pi, size * sizeof(int));
        }
        pi[count++] = num;
    }
    for (i = 0; i< count ; i++){
        printf("%5d", pi[i]);
    }
    free(pi);

    return 0;
}

### 코드의 주요 부분 설명

1. **초기 메모리 할당**:
    - `int *pi` 포인터를 선언하고, `malloc`을 사용하여 초기에 `int` 타입 한 개의 크기만큼 메모리를 할당합니다.

2. **자연수 입력 받기**:
    - 무한 루프(`while(1)`) 안에서 `scanf`를 사용하여 사용자로부터 자연수 `num`을 입력받습니다.
    - 입력된 수가 0 이하이면 루프를 `break`로 빠져나옵니다.

3. **메모리 재할당**:
    - 입력된 자연수의 개수(`count`)가 현재 배열의 크기(`size`)와 같아지면, `size`를 5만큼 증가시키고, `realloc`을 사용하여 메모리를 재할당합니다. 이렇게 하면 배열의 크기가 필요에 따라 동적으로 증가합니다.

4. **자연수 저장**:
    - 입력받은 자연수는 `pi[count++] = num;`를 통해 배열에 저장됩니다. `count`는 입력받은 자연수의 개수를 나타내며, 하나의 수를 저장할 때마다 증가합니다.

5. **입력받은 자연수 출력**:
    - 입력받은 자연수들을 저장한 배열을 `for` 루프를 사용하여 출력합니다.

6. **메모리 해제**:
    - 모든 작업이 끝나면 `free(pi);`를 호출하여 할당된 메모리를 해제합니다. 프로그램에서 동적으로 할당된 메모리는 사용이 끝난 후 반드시 해제해야 합니다.

### 주의 사항 및 개선 포인트

- `gets` 함수 대신 `fgets` 함수를 사용하고, 입력 문자열에서 개행 문자를 제거하는 방법으로 입력을 처리하는 것이 좋습니다. `gets`는 보안에 취약하므로, 현대의 C 프로그래밍에서는 사용을 지양합니다.

728x90
반응형
LIST