#include <iostream>
using namespace std;
bool a[5];
int main()
{
for (int i = 0; i < 5; i++)
{
cout<<a[i]<<" ";
}
return 0;
}
以上代码中输出为0 0 0 0 0
,但是下面代码输出却是不确定的.这是为什么?
#include <iostream>
using namespace std;
int main()
{
bool a[5];
for (int i = 0; i < 5; i++)
{
cout<<a[i]<<" ";
}
return 0;
}
输出176 74 183 230 255
두 코드의 A는 기본적으로 초기화됩니다. 차이점은 기본 초기화 전에 전역 변수 a가 먼저 0으로 초기화(zero-initialized)되는 반면, 로컬 변수 a는 그렇지 않다는 것입니다. 이는 지역 변수가 0으로 초기화되지 않음을 의미합니다. 동시에, 이 기본 초기화 지역 변수 a의 값은 불확실합니다. 따라서 여기서 전역 변수 a의 값은 0이고, 지역 변수 a의 값은 불확실합니다.
변수가 실제로 0으로 초기화되는지 여부는 변수의 저장 기간과 관련이 있습니다. 정적 변수는 초기화되기 전에 0으로 초기화되지만 자동 변수는 그렇지 않습니다.
을 참조하세요.정의되지 않은 전역 변수는 0으로 초기화되지만 함수 내에서 선언된 지역 변수에는 이 규칙이 없기 때문입니다
일반적으로 전역 변수와 정적 변수는 데이터 세그먼트에 배치되고, 지역 변수는 스택에 배치됩니다.
데이터 세그먼트는 컴파일 중에 결정되어 실행 파일에 할당되므로 반드시 초기화됩니다.
스택의 경우 런타임에 할당된다는 것을 알고 있습니다. 함수에 들어가면 레지스터가 스택에 푸시되는 것 외에도 임시 변수에도 스택 공간이 할당되므로 로컬 변수는 스택 주소에 해당합니다. 스택은 메모리에서 크게 변경되므로 초기 값이 불확실합니다.
물론 C 표준에서는 컴파일러가 변수를 어느 영역에 배치해야 하는지 지정하지 않지만 일반적으로 이렇게 구현됩니다.