#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 프로그래밍에서는 사용을 지양합니다.
'개념 > 혼자 공부하는 C언어' 카테고리의 다른 글
chapter 16) 동적 할당 영역을 배열처럼 사용 (0) | 2024.09.21 |
---|---|
chapter 16) 구조체를 선언하고 멤버를 사용하는 방법 (0) | 2024.09.20 |
chapter 15) 함수 포인터로 원하는 함수를 호출하는 방법 (0) | 2024.09.18 |
chapter 15) 함수 포인터를 사용한 함수 호출 (0) | 2024.09.17 |
chapter 15) void 포인터 사용 (0) | 2024.09.16 |