Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어에서 초기화되지 않은 배열에 접근하면 어떻게 될까? 개념부터 예제까지

개요

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}으로 초기화하거나, 필요한 값을 명시적으로 대입하는 습관을 들이는 것이 좋습니다.