개요
C 언어에서는 배열을 선언만 하고 초기화하지 않은 채 사용해도 컴파일 오류가 발생하지 않습니다. 그렇다면 초기화되지 않은 배열을 그대로 사용하면 어떤 일이 벌어질까요? 이 글에서는 그 동작 원리와 주의사항을 예제 코드와 함께 살펴봅니다.
핵심 정리
초기화되지 않은 배열을 사용해도 컴파일 오류나 런타임 오류는 발생하지 않습니다. 프로그램은 정상적으로 실행됩니다.
대신 해당 배열에는 메모리에 남아 있던 쓰레기 값(garbage value)이 들어 있어, 예측할 수 없는 결과를 얻게 됩니다.
따라서 배열을 선언할 때는 반드시 기본값으로 요소들을 초기화하는 것이 안전한 코딩 습관입니다.
예제 프로그램 1
다음은 세 가지 방식으로 선언된 배열을 각각 출력하는 C 프로그램입니다.
#include <stdio.h>
int main(void){
int a[4]; // 완전히 초기화되지 않은 배열
int b[4] = {1}; // 첫 번째 요소만 초기화
int c[4] = {1,2,3,4}; // 모든 요소를 초기화
int i; // 반복문 카운터
// 모든 배열의 요소 출력
printf("\nArray a:\n");
for( i=0; i<4; i++ )
printf("arr[%d]: %d\n",i,a[i]);
printf("\nArray b:\n");
for( i=0; i<4; i++)
printf("arr[%d]: %d\n",i,b[i]);
printf("\nArray c:\n");
for( i=0; i<4; i++ )
printf("arr[%d]: %d\n",i, c[i]);
return 0;
}실행 결과
Array a: arr[0]: 4195872 arr[1]: 0 arr[2]: 4195408 arr[3]: 0 Array b: arr[0]: 1 arr[1]: 0 arr[2]: 0 arr[3]: 0 Array c: arr[0]: 1 arr[1]: 2 arr[2]: 3 arr[3]: 4
결과 분석
실행 결과를 보면 다음과 같은 차이를 확인할 수 있습니다.
배열 a: 아무것도 초기화하지 않았기 때문에 메모리에 남아 있던 임의의 값(쓰레기 값)이 출력됩니다. 실행할 때마다 결과가 달라질 수 있습니다.
배열 b:
{1}로 초기화하면 나머지 요소들은 자동으로 0으로 채워집니다. 즉, 일부만 초기화하면 나머지는 0이 됩니다.배열 c: 모든 요소를 명시적으로 초기화했기 때문에 입력한 값이 그대로 출력됩니다.
예제 프로그램 2
부분 초기화와 무초기화의 차이를 한 번 더 확인하는 예제입니다.
#include <stdio.h>
int main(void){
int A[4]; // 초기화 안 함
int B[4]; // 초기화 안 함
int C[4] = {1,2}; // 앞의 두 요소만 초기화
int i; // 반복문 카운터
// 모든 배열의 요소 출력
printf("\nArray a:\n");
for( i=0; i<4; i++ )
printf("arr[%d]: %d\n",i,A[i]);
printf("\nArray b:\n");
for( i=0; i<4; i++)
printf("arr[%d]: %d\n",i,B[i]);
printf("\nArray c:\n");
for( i=0; i<4; i++ )
printf("arr[%d]: %d\n",i, C[i]);
return 0;
}실행 결과
Array a: arr[0]: 4195856 arr[1]: 0 arr[2]: 4195408 arr[3]: 0 Array b: arr[0]: -915120393 arr[1]: 32767 arr[2]: 0 arr[3]: 0 Array c: arr[0]: 1 arr[1]: 2 arr[2]: 0 arr[3]: 0
참고 사항
C 언어에서 지역 변수로 선언된 배열을 초기화하지 않으면, 해당 메모리 공간에는 이전에 사용되던 임의의 값이 그대로 남아 있습니다. 이 때문에 프로그램은 오류 없이 실행되지만, 엉뚱한 쓰레기 값이 출력되거나 더 심각하게는 예측 불가능한 동작을 유발할 수 있습니다.
특히 배열 B처럼 크고 작은 값이 뒤섞여 나오는 경우가 많으며, 이런 값들은 디버깅을 어렵게 만드는 주범입니다. 따라서 배열을 선언하는 즉시 {0}으로 초기화하거나, 필요한 값을 명시적으로 대입하는 습관을 들이는 것이 좋습니다.