C에서 전역 변수는 항상 0으로 초기화됩니까?
#include <stdio.h>
int a[100];
int main(){
printf("%d",a[5]);
return 0;
}
위 코드는 항상 '0'을 출력합니까, 아니면 컴파일러 고유의 것입니까?저는 gcc 컴파일러를 사용하고 있는데 출력이 '0'으로 나왔습니다.
네, 멤버 전원이.a
0으로 초기화할 것을 보장합니다.
C89 표준 제3.5.7절부터
정적 저장 기간이 있는 개체가 명시적으로 초기화되지 않은 경우 산술 형식을 가진 모든 멤버에 0이 할당되고 포인터 형식을 가진 모든 멤버에 null 포인터 상수가 할당된 것처럼 암묵적으로 초기화됩니다.
"글로벌 변수"는 파일 범위, 함수 외부에서 정의됩니다.파일 범위에서 정의된 모든 변수 및 키워드로 선언된 모든 변수static
정적 저장 기간이라고 하는 것이 있습니다.이것은 메모리의 다른 부분에 할당되고 프로그램의 전체 수명 동안 존재한다는 것을 의미합니다.
이것은 또한 어떤 C 컴파일러에서도 0으로 초기화되는 것이 보장된다는 것을 의미합니다.
현재 C 표준 C116.7.9/10부터:
"... 정적 또는 스레드 저장 기간이 있는 개체가 명시적으로 초기화되지 않은 경우:
— 포인터 유형을 가진 경우 Null 포인터로 초기화됩니다.
— 산술 형식을 가질 경우 0(양수 또는 부호 없음)으로 초기화됩니다."
실질적으로, 이것은 만약 당신이 당신의 전역 변수를 주어진 값으로 초기화한다면, 그것은 그 값을 가질 것이고 그것은 보통 다음과 같이 언급되는 메모리 세그먼트에 할당될 것이라는 것을 의미합니다..data
. 값을 지정하지 않으면 다음과 같은 다른 세그먼트에 할당됩니다..bss
. 글로벌은 스택에 할당되지 않습니다.
예. 모든 전역 변수는 해당 유형의 기본값으로 초기화됩니다.0
는 기본값이며 모든 유형에 자동으로 캐스트됩니다.포인터라면,0
된다NULL
전역 변수는 영점화된 데이터 세그먼트의 공간을 확보합니다.
컴파일러에 특정한 것은 아니지만 C 표준에 정의되어 있습니다.
그래서 항상 0을 출력할 것입니다.
는 됩니다.0
로에))NULL
포인터의 경우).
명시적 초기화자 없이 선언된 블록 범위의 정적이 아닌 개체는 초기화되지 않은 상태로 유지됩니다.
C에서 글로블 변수는 항상 0으로 초기화됩니까?
예 그리고 C 표준에 정의되어 있습니다.
컴파일러에 특정한 것은 아닙니다.다로 됩니다.0
.
언급URL : https://stackoverflow.com/questions/16015656/are-global-variables-always-initialized-to-zero-in-c
'bestsource' 카테고리의 다른 글
openstdin, stdout, stderr 방향 전환을 제어하는 방법? (0) | 2023.10.01 |
---|---|
C 휘발성 변수와 캐시 메모리 (0) | 2023.10.01 |
a = 0, b = a++, c = a++의 정의가 C에 정의된 동작을 가지고 있습니까? (0) | 2023.10.01 |
front end or back end의 api 오류 메시지 국제화? (0) | 2023.10.01 |
VARCHAR(255)가 다른 길이와 달리 자주 사용되는 이유가 있습니까? (0) | 2023.10.01 |