c++全局变量初始化问题
阿神
阿神 2017-04-17 15:29:36
0
3
642
#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

阿神
阿神

闭关修行中......

모든 응답(3)
黄舟

두 코드의 A는 기본적으로 초기화됩니다. 차이점은 기본 초기화 전에 전역 변수 a가 먼저 0으로 초기화(zero-initialized)되는 반면, 로컬 변수 a는 그렇지 않다는 것입니다. 이는 지역 변수가 0으로 초기화되지 않음을 의미합니다. 동시에, 이 기본 초기화 지역 변수 a의 값은 불확실합니다. 따라서 여기서 전역 변수 a의 값은 0이고, 지역 변수 a의 값은 불확실합니다.

변수가 실제로 0으로 초기화되는지 여부는 변수의 저장 기간과 관련이 있습니다. 정적 변수는 초기화되기 전에 0으로 초기화되지만 자동 변수는 그렇지 않습니다.

8.5 초기화
...
5 T 유형의 객체 또는 참조를 0으로 초기화한다는 것은 다음을 의미합니다.
— T가 스칼라 유형(3.9)인 경우 객체는 다음으로 설정됩니다. 정수 상수 표현식으로 사용된 값 0(영)은 T로 변환됩니다.
...
— T가 배열 유형인 경우 각 요소는 0으로 초기화됩니다.
6 T 유형의 객체를 기본 초기화한다는 의미는 다음과 같습니다.
— T가 (아마도 cv 자격을 갖춘) 클래스 유형인 경우(9절) T의 기본 생성자가 호출됩니다(그리고 T에 액세스 가능한 기본 생성자가 없으면 초기화 형식이 잘못되었습니다.
— T가 배열 유형인 경우 각 요소는 기본적으로 초기화됩니다.
— 그렇지 않으면 초기화는 수행되지 않습니다.
...
9 [ 참고: 다른 초기화가 수행되기 전에 프로그램 시작 시 정적 저장 기간의 모든 개체가 0으로 초기화되는 경우도 있습니다. —끝. note ]
...
11 객체에 대해 초기화 프로그램이 지정되지 않으면 객체는 기본적으로 초기화됩니다. 초기화가 수행되지 않으면 자동 또는 동적 저장 기간이 있는 객체는 불확실한 값을 갖습니다. 참고: 정적 또는 스레드 저장 기간이 있는 개체는 0으로 초기화됩니다. 3.6.2 — 최종 참고 사항 ]

을 참조하세요.
Peter_Zhu

정의되지 않은 전역 변수는 0으로 초기화되지만 함수 내에서 선언된 지역 변수에는 이 규칙이 없기 때문입니다

巴扎黑

일반적으로 전역 변수와 정적 변수는 데이터 세그먼트에 배치되고, 지역 변수는 스택에 배치됩니다.
데이터 세그먼트는 컴파일 중에 결정되어 실행 파일에 할당되므로 반드시 초기화됩니다.
스택의 경우 런타임에 할당된다는 것을 알고 있습니다. 함수에 들어가면 레지스터가 스택에 푸시되는 것 외에도 임시 변수에도 스택 공간이 할당되므로 로컬 변수는 스택 주소에 해당합니다. 스택은 메모리에서 크게 변경되므로 초기 값이 불확실합니다.
물론 C 표준에서는 컴파일러가 변수를 어느 영역에 배치해야 하는지 지정하지 않지만 일반적으로 이렇게 구현됩니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿