문제의 역사: 전역 및 정적 변수는 기능의 로컬 맥락 밖에 데이터를 저장하기 위해 C 언어에 도입되었습니다. 자동 사전 초기화 및 실행 파일 내 특정 섹션에 배치되는 것은 프로그램의 작업을 최적화하지만, 이해하지 않으면 명확하지 않은 동작을 초래할 수 있습니다.
문제: 전역 및 정적 변수는 명시적으로 지정된 값이나 자동적으로 0으로 초기화된다는 것을 아는 것이 중요합니다 (제로 초기화). 초기화는 main 시작 전에 이루어지므로 초기화되지 않은 데이터에 접근할 위험이 감소하지만, 특정 조건에서는 여러 모듈의 초기화와 로딩 순서와 관련된 예기치 않은 의존성을 발생시킵니다.
해결 방법:
코드 예시:
#include <stdio.h> static int stat_var; int glob_var = 42; int main() { printf("static: %d, global: %d ", stat_var, glob_var); }
주요 특징:
1. 정적 변수의 암묵적인 0 초기화에 의존할 수 있습니까, 이것이 안전한 관행이라고 생각합니까?
기술적으로 동작하지만 대규모 프로젝트에서는 가독성을 위해 변수들을 명시적으로 초기화하는 것이 더 좋습니다. 컴파일러/링커의 변화로 인한 잠재적 변동을 방지할 수 있습니다.
2. 정적 변수가 외부 함수에서 초기화 없이 선언되면 결과는 무엇입니까?
그 변수는 여전히 0으로 초기화됩니다: static int value;는 항상 0입니다.
3. 초기화기가 있는 전역 변수가 별도의 격리된 모듈에서 선언되면 초기화는 언제 이루어집니까?
초기화는 main 호출 전에 이루어지지만, 서로 다른 모듈 간의 표준은 이러한 변수의 초기화 순서를 보장하지 않으므로 다른 모듈의 생성자에서 초기화되지 않은 데이터에 접근할 수 있는 가능성이 있습니다.
개발자가 항상 명시적으로 초기화할 것이라는 가정 하에 공통 상태를 저장하기 위해 정적 변수를 선언하였습니다.
장점:
단점:
리뷰 후 변수는 선언 시점에 명시적으로 초기화되었습니다.
장점:
단점: