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

C/C++에서 초기화되지 않은 기본 데이터 타입의 값은 무엇일까?

C나 C++ 프로그래밍에서 가장 자주 접하는 질문 중 하나는 바로 "초기화되지 않은 기본(primitive) 데이터 타입의 값은 과연 무엇일까?"라는 것입니다.

많은 초보 개발자들은 컴파일러가 정수형에는 0, 실수형에는 0.0처럼 적절한 기본값을 자동으로 할당해 줄 것이라고 생각합니다. 하지만 실제 답은 사용하는 운영체제와 컴파일러 환경에 따라 달라집니다. 특히 문자형(char) 데이터의 경우 어떤 값이 들어 있을지 예측하기 더욱 어렵습니다.

예제 코드

다음 코드는 초기화하지 않은 여러 기본 데이터 타입 변수를 선언한 뒤 그 값을 그대로 출력하는 예제입니다.

#include <iostream>
using namespace std;
main() {
    char a;
    float b;
    int c;
    double d;
    long e;
    cout << a << "\n";
    cout << b << "\n";
    cout << c << "\n";
    cout << d << "\n";
    cout << e << "\n";
}

실행 결과 비교

윈도우(Windows) 컴파일러에서 실행한 경우

1.4013e-045
0
2.91499e-322
0

리눅스(Linux) 컴파일러에서 실행한 경우

0
0
0
0

위 결과에서 볼 수 있듯이, 윈도우 컴파일러에서는 쓰레기(garbage) 값으로 보이는 이상한 숫자들이 출력된 반면, 리눅스 컴파일러에서는 우연히 모두 0으로 출력되었습니다. 이는 초기화되지 않은 지역 변수가 불확정(indeterminate) 값, 즉 해당 메모리 위치에 이전에 남아 있던 임의의 값을 그대로 담고 있기 때문입니다.

왜 C/C++는 기본값을 자동으로 할당하지 않을까?

그렇다면 왜 C나 C++는 변수에 기본값을 자동으로 넣어주지 않을까요?

그 이유는 성능 때문입니다. 스택(stack) 영역에 생성되는 지역 변수를 일일이 초기화하는 작업은 상당한 오버헤드를 유발하며, 프로그램의 실행 속도를 저하시킵니다. C와 C++는 시스템 프로그래밍 언어로서 최대한의 성능을 지향하기 때문에, 개발자가 명시적으로 초기화하지 않은 변수에는 임의의 중간 값이 남아 있을 수 있도록 설계되었습니다.

따라서 결론은 명확합니다. 기본 데이터 타입 변수는 반드시 사용하기 전에 직접 초기화해야 합니다. 초기화되지 않은 변수를 읽는 행위는 C/C++ 표준에서 정의되지 않은 동작(undefined behavior)에 해당하며, 예측 불가능한 버그의 주요 원인이 됩니다.