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

C 언어에서 변수의 암시적 초기화 이해하기: 0으로 채워지는 값들의 원리

C 언어에서는 코드에서 변수를 사용하기 전에 반드시 선언해야 한다는 것을 잘 알고 있습니다. 그런데 흥미롭게도 일부 변수는 별도의 초기화 없이도 자동으로 0 또는 1의 값을 갖게 됩니다. 이번 글에서는 이러한 '암시적 초기화(implicit initialization)'가 어떤 경우에 발생하는지 예제를 통해 살펴보겠습니다.

전역 변수와 매개변수의 암시적 초기화

아래 예제는 전역 변수와 main 함수의 첫 번째 매개변수가 어떻게 자동으로 초기화되는지 보여줍니다.

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

x, y, array[3]; // 전역 변수들은 암시적으로 0으로 초기화됨

int main(i) {
    // 매개변수 i에는 1이 저장됨 (인자의 개수)
    int index;
    printf("x = %d, y = %d\n\n", x, y);
    for(index = 0; index < 3; index++)
        printf("Array[%d] = %d\n", index, array[index]);
    printf("i의 값 : %d", i);
}

실행 결과

x = 0, y = 0
Array[0] = 0
Array[1] = 0
Array[2] = 0
i의 값 : 1

왜 이런 결과가 나올까요?

그 이유는 다음과 같습니다.

  • 전역 변수의 영 초기화: C 표준에 따르면 명시적인 초기값이 지정되지 않은 전역 변수와 정적(static) 변수는 프로그램 시작 시 자동으로 0으로 초기화됩니다. 따라서 x, y, array의 모든 요소가 0이 됩니다.
  • main 함수의 첫 번째 인자: main 함수의 첫 번째 매개변수는 프로그램 실행 시 전달된 인자의 개수(argument count)를 의미합니다. 프로그램 이름 자체도 하나의 인자로 계산되기 때문에, 최소한 항상 1이 됩니다.

배열의 부분 초기화

배열을 선언하면서 일부 요소만 초기화하면, 나머지 요소들은 자동으로 0으로 채워집니다. 아래 예제를 통해 확인할 수 있습니다.

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

int main() {
    int index;
    int array[10] = {1, 2, 3, 4, 5, 6}; // 앞의 6개만 초기화
    for(index = 0; index < 10; index++)
        printf("Array[%d] = %d\n", index, array[index]);
}

실행 결과

Array[0] = 1
Array[1] = 2
Array[2] = 3
Array[3] = 4
Array[4] = 5
Array[5] = 6
Array[6] = 0
Array[7] = 0
Array[8] = 0
Array[9] = 0

정리

C 언어의 암시적 초기화 규칙을 요약하면 다음과 같습니다.

  • 초기화하지 않은 전역 변수 및 static 변수는 0으로 자동 초기화됩니다.
  • main 함수의 첫 번째 매개변수(argc)는 프로그램 이름이 포함되므로 항상 1 이상입니다.
  • 배열을 부분적으로 초기화하면 나머지 요소는 모두 0으로 채워집니다.
  • 반면, 함수 내부의 일반 지역 변수는 초기화하지 않으면 쓰레기 값(garbage value)을 가지므로 반드시 사용 전에 초기화하는 것이 안전합니다.

이러한 규칙을 잘 이해하고 있으면 의도치 않은 버그를 예방하고, 더 깔끔하고 안정적인 C 코드를 작성하는 데 큰 도움이 됩니다.