변수의 범위(scope)와 수명(lifetime)은 C 프로그램 구조의 주요 측면 중 하나입니다. 범위는 변수가 이름으로 접근 가능한 코드의 부분을 의미합니다. 수명은 변수가 메모리에서 실제로 존재하는 시점을 정의합니다.
문제 형식
C는 저수준 제어를 위해 설계되었기 때문에, 변수 선언 위치에 따라 범위와 수명을 분류하여 유연하지만 위험한 접근 방식을 제공합니다 (블록, 파일, 글로벌, 정적).
문제
범위/수명에 대한 잘못된 이해는 전형적인 버그를 초래합니다: 접근할 수 없거나 이미 제거된 변수에 대한 접근 시도(use-after-free), 글로벌 변수와 로컬 변수 간의 이름 충돌(그림자 변수), 의도하지 않은 글로벌 변수의 변경.
해결책
필요한 저장 유형(auto, static, extern)을 명확하게 정의하고, 블록 범위를 합리적으로 사용하며, 글로벌 변수의 수를 최소화하고, 스택과 스택 외부의 수명을 명확히 구분합니다.
코드 예시:
int global_var; // 글로벌, 프로그램 전체 실행 동안 존재 void func() { int local_var = 5; // 자동, func() 내에서만 존재 static int stat_var = 0; // 정적, 호출 간에 존재 stat_var++; }
주요 특징:
다른 블록에서 동일한 이름의 변수를 두 번 선언하면 어떻게 됩니까?
내부 변수는 외부 변수를 가립니다(그림자 변수). 이는 예기치 않은 오류를 초래할 수 있습니다.
int x = 10; ... if (1) { int x = 50; printf("%d", x); // 50을 출력하고, 글로벌 x는 숨겨짐 }
함수 내에 정의된 자동 변수의 수명은 어떻게 됩니까?
함수가 호출되는 동안만 존재합니다. 함수가 끝나면 메모리가 해제되고 값도 사라집니다.
정적 로컬 변수를 해당 함수 외부에서 사용할 수 있습니까?
아니요, 범위는 함수 내부에서만 유효합니다. 수명은 프로그램의 전체 실행 동안 존재하지만, 외부에서는 볼 수 없습니다.
void f() { static int x = 0; } // f() 외부에서 접근 불가
static vs auto).초보 개발자가 루프 내에서 카운터를 static으로 생성하고 이 카운터가 각 반복 간에 값을 "축적"하며, 매번 초기화될 것이라 예상했습니다.
장점:
단점:
개발자는 캐싱을 위해 strict하게 static을 사용하고, 임시 필요에 대해서는 일반 auto 변수를 사용합니다.
장점:
단점: