문제 상황
C 언어에서 int형과 float형 변수를 선언만 하고 초기화하지 않은 뒤, 해당 변수들의 값을 출력하면 어떤 일이 발생하는지 알아보겠습니다.
해결 방법
변수를 선언만 하고 초기화하지 않은 상태(미초기화 변수)에서 그 값을 출력하려고 하면, 0 또는 쓰레기값(garbage value)이 반환됩니다.
변수를 선언하면 해당 변수를 위해 메모리 공간이 할당됩니다. 초기화란, 선언 시점에 이미 할당된 이 메모리 공간에 원하는 값을 저장하는 작업입니다.
아래 프로그램에서는 할당된 메모리 공간에 값을 저장하지 않았습니다. 하지만 메모리 위치에는 기본적으로 0 또는 이전에 남아 있던 임의의 값(쓰레기값)이 들어 있습니다. 따라서 값을 출력하면 0 또는 쓰레기값이 화면에 표시됩니다.
예제 코드
다음은 초기화하지 않은 int형과 float형 변수에 접근하는 C 프로그램입니다.
#include<stdio.h>
int main(){
float a,b,c;
int x,y,z;
printf("value of a:%f\n",a);
printf("value of b:%f\n",b);
printf("value of c:%f\n",c);
printf("value of x:%d\n",x);
printf("value of y:%d\n",y);
printf("value of z:%d",z);
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
value of a:0.000000 value of b:0.000000 value of c:0.000000 value of x:1512368 value of y:0 value of z:27
결과 분석
출력 결과를 보면 float형 변수 a, b, c는 모두 0.000000으로 출력된 반면, int형 변수 x, y, z는 각각 1512368, 0, 27처럼 제각각의 값이 나타납니다. 이는 미초기화 변수가 담고 있는 값이 컴파일러, 운영체제, 메모리의 이전 사용 여부에 따라 달라지기 때문입니다.
즉, 미초기화 지역 변수의 값은 예측할 수 없으며(undefined behavior), 실행할 때마다 다른 값이 나올 수도 있습니다. 따라서 실제 개발에서는 변수를 선언하는 즉시 반드시 초기화하는 습관을 들이는 것이 좋습니다. 예를 들어 int x = 0;, float a = 0.0f;처럼 명시적으로 초기값을 지정하면 예측 불가능한 오류를 예방할 수 있습니다.