백준 알고리즘 문제를 풀다가 처음으로 변수를 초기화 하지 않아 발생한 문제에 봉착했다.
문제의 백준 알고리즘 문제
https://www.acmicpc.net/problem/1546
[처음 작성한 코드]
#include <stdio.h>
int main(void){
double num, max, sum, input[1000];
scanf("%lf",&num);
for(int i=0; i<num; i++){
scanf("%lf",&input[i]);
if(input[i]>max)
max=input[i];
printf("%d",max); //*****
}
for(int j=0; j<num; j++){
input[j]=input[j]/max*100;
sum+=input[j];
}
printf("%.2lf\n",sum/num);
return 0;
}
여기서
printf("%d",max);
이쪽 부분은 처음에 입력 받은 과목들의 최고점수를 출력해서 내 의도대로 진행이 되고 있는지 확인 차 넣은 부분인데 빌드를 해보니 말도 안되는 숫자가 나왔다.
60 70 80점을 입력값으로 넣으면 개 뜬금없이 max가 4654981616 이딴식으로 값이 나왔던 것이다.
다른 사람은 어떻게 만들었나 하고 찾아보니 코드 자체는 비슷했지만 변수를 처음 선언할 때 초기값을 정해줬다는 차이가 있었더라.
#include <stdio.h>
int main(void){
double num=0, max=0, sum=0;
double input[1000];
scanf("%lf",&num);
for(int i=0; i<num; i++){
scanf("%lf",&input[i]);
if(input[i]>max)
max=input[i];
}
for(int j=0; j<num; j++){
input[j]=input[j]/max*100;
sum+=input[j];
}
printf("%.2lf\n",sum/num);
return 0;
}
아니 이렇게 짜니까 값이 정상적으로 나오는게 아닌가?
찾아보니, c언어에서는 변수를 선언하면 그 전에 메모리에 있던 쓰레기 값이라는 것이 변수 선언과 함께 아무 의미 없는 값들이 딸려 나올 수 있다고 한다.
변수 선언 시에 할당 받은 메모리 공간을 그 전에 다른 프로그램에서 사용하고 있었다면 그 프로그램이 종료되었더라도 실제 메모리에 저장되었던 데이터가 남아 있기 때문에 변수를 초기화 하지 않으면 이런 현상이 발생한다고 한다.
C언어에서 배열을 선언할때도 값을 초기화 시켜두지 않으면 에러가 뜨는데 내가 프로그래밍 처음 접했던 자바같은 경우는 그냥 무지성으로 선언하고 초기화 시켜두지 않아도 지가 알아서 0으로 초기화 시켜줬기 때문에 내가 모르고 살았던 것 같다.
앞으로 이상한 값이 나오면 변수를 초기화 시켰는지도 확인해 봐야겠다.