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

C/C++에서 전역 변수와 정적 변수가 기본값으로 초기화되는 이유

C/C++에서 전역 변수(global variable)와 정적 변수(static variable)가 자동으로 기본값, 즉 0으로 초기화되는 이유는 크게 두 가지입니다. 첫째, C와 C++ 표준에서 이를 명확히 규정하고 있기 때문입니다. 둘째, 프로그램 시작 시점에 메모리를 0으로 채우는 작업은 컴파일 시점이나 로딩 시점에 처리되므로 런타임에 추가 비용이 거의 발생하지 않기 때문입니다.

컴파일러 관점에서 보면 정적 변수와 전역 변수는 생성된 오브젝트 코드에서 동일하게 취급됩니다. 두 변수 모두 실행 파일의 .bss 섹션에 할당되며, 프로그램이 메모리에 로드될 때 해당 영역 전체가 한 번에 0으로 초기화됩니다. 덕분에 개발자가 별도로 초깃값을 지정하지 않아도 이 변수들은 자동으로 0을 갖게 됩니다.

예제 코드

#include <stdio.h>
int a;              // 전역 변수
static int b;       // 전역 정적 변수
int main() {
    int x;          // 일반 지역 변수
    static int y;   // 지역 정적 변수
    int z = 28;     // 초기화된 지역 변수
    printf("전역 변수 a의 기본값 : %d", a);
    printf("\n전역 정적 변수 b의 기본값 : %d", b);
    printf("\n지역 변수 x의 기본값 : %d", x);
    printf("\n지역 정적 변수 y의 기본값 : %d", y);
    printf("\n지역 변수 z의 값 : %d", z);
    return 0;
}

실행 결과

전역 변수 a의 기본값 : 0
전역 정적 변수 b의 기본값 : 0
지역 변수 x의 기본값 : 0
지역 정적 변수 y의 기본값 : 0
지역 변수 z의 값 : 28

위 프로그램에서 abmain() 함수 외부에 선언된 전역 변수이며, 그중 b는 정적 변수입니다. 함수 내부에는 세 개의 지역 변수가 선언되어 있는데, z만 명시적으로 28로 초기화했습니다.

int a;
static int b;
....
int x;
static int y;
int z = 28;

각 변수의 값을 출력하면 다음과 같습니다.

printf("전역 변수 a의 기본값 : %d", a);
printf("\n전역 정적 변수 b의 기본값 : %d", b);
printf("\n지역 변수 x의 기본값 : %d", x);
printf("\n지역 정적 변수 y의 기본값 : %d", y);
printf("\n지역 변수 z의 값 : %d", z);

주의할 점

여기서 중요한 구분이 필요합니다. 전역 변수와 정적 변수(a, b, y)는 .bss 섹션에 할당되어 표준에 의해 0 초기화가 보장됩니다. 반면 일반 지역 변수(x)는 스택에 할당되며, 초기화하지 않으면 그 값은 결정되어 있지 않습니다(indeterminate value). 위 실행 결과에서 x가 0으로 출력된 것은 단순히 해당 메모리 위치에 우연히 0이 들어 있었을 가능성이 높으며, 표준이 보장하는 동작이 아닙니다. 따라서 일반 지역 변수는 반드시 사용하기 전에 명시적으로 초기화해야 안전한 코드를 작성할 수 있습니다.