코딩 잡동사니

[C] 동적 메모리 할당을 이용한 가변 배열 만들기

코딩하는 원숭이 2022. 5. 22. 17:43

학부생일적 받았던 간단한 과제였다. C로 구현하였고 더 까먹기전에 블로그에 정리해둔다.

 

#조건

① 세자리수를 입력받는다.(이 부분에 대해선 따로 예외처리하지 않았다.)

② 수를 입력받은 뒤,  "그게 계산하려는 모든 숫자입니까?"메세지를 출력하여 연산을 끝낼지 결정한다.

③ 연산이 끝나지 않았으면 다시 수를 입력받고, 끝났으면 입력한 번호 리스트와 그의 합계, 평균, 최댓값, 최솟값을 구하여 출력한다.

 

#Lesson learned

처음엔 malloc만 사용하여 구현했는데, '중단점을 트리거 했습니다.'라는 오류 메세지와 함께 프로그램이 죽어버렸다. 그러나 relloc을 사용하여 이 부분을 간단하게 해결할 수 있었다. 

 

#사용한 라이브러리 함수

- malloc(int size) : size크기의 메모리 블록을 할당하고, 이 메모리 블록의 시작 주소를 반환한다. 메모리 확보가 불가능하면 NULL을 반환한다. 

int* pi = (int*)malloc(sizeof(int));	//int를 저장할 공간 할당

- realloc(void block, int size)

(int*)realloc(score, (start) * sizeof(int))

 

#소스코드

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

int main()
{
	int start = 1;
	int* score;
	int i = 0;
	char answer;
	int sum = 0;
	int avg = 0;
	int min = 999;
	int max = 0;
	int minEx, maxEx;

	score = (int*)malloc(start * sizeof(int));
	
	while (1)
	{
		
		printf("세 자리 수를 입력하시오>>");
		score[i] = 0;

		scanf(" %d", &score[i]);

		printf("그게 입력하려는 모든 숫자입니까?( y / n )");
		scanf(" %c", &answer);
		
		if (answer == 'y')
		{
			break;
		}
		else if (answer == 'n')
		{
			start++;
			score = (int*)realloc(score, (start) * sizeof(int));	//가변 배열 길이 재할당
		}
		i++;
		
	}
	printf("입력 번호: ");
	for (int i = 0; i < start; i++)
	{
		printf(" %d ", score[i]);
	}
	printf("\n");

	for (int j = 0; j < start; j++)
	{
		if (max < score[j])
		{
			max = score[j];
		}
		if (score[j] < min)
		{
			min = score[j];
		}

		sum += score[i];
	}

	printf("\n");
	printf("합계: %d\n", sum);
	printf("평균: %f\n", (float)sum /start);
	printf("MAX: %d\n",max);
	printf("MIN: %d\n", min);

	
	free(score);
	return 0;
}