글로벌 변수는 항상 '0'으로 초기화되지만 로컬 변수는 초기화되지 않는 이유는 무엇입니까?
코드를 참조해 주세요.
#include <stdio.h>
int a;
int main(void)
{
int i;
printf("%d %d\n", a, i);
}
산출량
0 8683508
여기서 'a'는 '0'으로 초기화되지만 'i'는 '정크 값'으로 초기화됩니다. 왜일까요?
왜냐하면 C 스탠다드에 따르면 그런 식이기 때문입니다.그 이유는 효율성 때문입니다.
스태틱 변수는 주소가 알려져 고정되기 때문에 컴파일 시에 초기화됩니다.초기화 대상
0에는 런타임 비용이 들지 않습니다.자동변수는 다른 콜에 대해 다른 주소를 가질 수 있으며 함수를 호출할 때마다 런타임에 초기화해야 하므로 필요하지 않은 런타임 비용이 발생할 수 있습니다.초기화가 필요한 경우 요청하십시오.
global그리고.static변수는 초기화 시 데이터 세그먼트(DS)에 저장되며 초기화되지 않은 경우 BSS(Block Start by Symbol)에 저장됩니다.
이러한 변수에는 고정 메모리 위치가 있으며 메모리는 컴파일 시에 할당됩니다.
따라서global그리고.static변수에는 다음이 있습니다'0'디폴트값으로 설정합니다.
반면에.auto변수는 스택에 저장되며 고정 메모리 위치는 없습니다.
메모리가 할당되어 있다auto런타임에는 변수를 지정하지만 컴파일 시에는 지정하지 않습니다.이런 이유로auto변수 기본값은 가비지입니다.
단순 변수를 선택했지만 다음 사항을 고려하십시오.
void matrix_manipulation(void)
{
int matrix1[100][100];
int matrix2[100][100];
int matrix3[100][100];
/* code to read values for matrix1 from a file */
/* code to read values for matrix2 from a file */
/* code to multiply matrix1 by matrix2 storing the result in matrix3 */
/* code to use matrix3 somehow */
}
시스템이 어레이를 0으로 초기화할 경우 작업이 낭비되고 나머지 함수에 의해 초기화가 덮어쓰게 됩니다.C는 가능한 한 숨겨진 비용을 회피한다.
글로벌 변수가 할당 및 초기화되기 전에main함수가 시작되고 프로그램 인스턴스가 실행될 때 로컬 변수가 스택에 생성됩니다.
언급URL : https://stackoverflow.com/questions/14049777/why-are-global-variables-always-initialized-to-0-but-not-local-variables
'programing' 카테고리의 다른 글
| 프로덕션 빌드 전용 오류:Vuetify 대상 데이터 앱을 찾을 수 없습니다. (0) | 2022.07.24 |
|---|---|
| 이 GCC 오류 "..."에 맞게 재배치가 잘렸습니다." " " " " ? ? (0) | 2022.07.24 |
| Vue.js에서 현재 날짜 형식을 지정하는 방법 (0) | 2022.07.24 |
| Gradle에서 사용되지 않는 종속성을 검색/제거하는 방법 (0) | 2022.07.24 |
| Vue.js: vue.js에서 조건부 렌더링과 함께 아리아 컨트롤을 사용합니다. (0) | 2022.07.23 |