프로그래밍임베디드 C 개발자

C 언어에서 로컬 변수와 글로벌 변수의 차이점과 작동 보장에 대해 설명하십시오. 이들의 수명, 가시성 및 초기화의 차이점은 무엇이며 서로 다른 유형의 변수 작업 시 발생할 수 있는 전형적인 오류는 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

문제의 역사:

글로벌 변수와 로컬 변수는 C에서 메모리 관리 및 코드 가시성을 위해 도입되었습니다. 글로벌 변수는 모듈 프로그래밍이 등장하기 전 함수 간 데이터 교환의 주요 방법이었으며, 로컬 변수는 상호작용을 줄이고 코드의 격리를 향상시켰습니다.

문제:

글로벌 변수와 로컬 변수 간의 차이, 즉 수명, 가시성, 초기화 규칙과 시간에 대한 오해가 자주 발생합니다. 글로벌 변수는 동기화 문제와 가독성 문제를 초래하고, 로컬 변수는 필요한 데이터에 접근할 수 없게 만듭니다. 이러한 차이에 대한 오해는 버그를 초래하고 코드 확장을 어렵게 만듭니다.

해결책:

글로벌 변수는 모든 함수 외부에서 선언되며 extern을 사용하여 모든 파일에서 접근할 수 있습니다. 그 수명은 전체 프로그램이며 초기화는 정적 변수의 경우 암묵적으로 0으로, 또는 사용자 값으로 명시적으로 수행됩니다. 로컬 변수는 함수 내에서 선언되며, 그 수명은 함수 호출로 제한되며 자동으로 초기화되지 않습니다.

코드 예:

int g_var = 42; // 글로벌 변수 void foo() { int l_var = 5; // 로컬 변수 }

주요 특징:

  • 글로벌 변수: 수명 — 전체 프로그램, 가시성 — 모든 파일(extern과 함께), 초기화는 기본적으로 0으로 (정의되지 않은 경우).
  • 로컬 변수: 수명 — 함수(또는 블록) 본문, 가시성 — 블록 내부에서만, 기본적으로 초기화되지 않음.
  • 이름 충돌, 우연한 접근 및 로컬 변수의 정의되지 않은 내용에서 발생하는 오류가 있습니다.

함정 질문.

로컬 변수가 초기값이 지정되지 않으면 자동으로 0으로 초기화됩니까?

아니요. 글로벌 변수와 정적 변수만 기본적으로 0으로 초기화됩니다. 로컬 변수는 명시적으로 초기값을 지정하지 않으면 '쓰레기' 값(정의되지 않은 값)을 포함합니다.

예:

void test() { int a; printf("%d ", a); // 정의되지 않은 동작 }

다른 파일에서 항상 글로벌 변수에 접근할 수 있습니까?

아니요. 변수가 함수 외부에서 static으로 선언되면 그 소스 파일 내에서만 볼 수 있습니다. 글로벌 가시성이 필요하면 extern을 사용하십시오.

함수 내에서 글로벌 변수를 선언할 수 있습니까?

아니요. 함수 내에서는 모든 선언이 로컬입니다. 글로벌 변수는 함수 외부에서만 생성할 수 있습니다.

전형적인 오류 및 안티패턴

  • 초기화되지 않은 로컬 변수 사용.
  • 글로벌 변수 과도 사용 — 유지 관리가 어렵고 동기화 오류를 초래합니다.
  • 이름 지정 오류로 인해 변수의 가림이 발생할 수 있습니다.

실제 사례

부정적인 사례

글로벌 변수를 사용하여 함수 간 데이터를 교환:

int error_code; void f1() { error_code = 1; } void f2() { if (error_code) ... }

장점:

  • 빠르고 간단한 해결책으로 매개변수를 전달할 필요 없음.

단점:

  • 초기화를 잊기 쉽고, 우연히 재정의될 가능성이 있으며, 멀티스레딩이 위험해질 수 있습니다.

긍정적인 사례

모든 변수가 로컬이며, 데이터는 함수 매개변수를 통해 전달:

void f1(int *err) { *err = 1; } void f2(int err) { if (err) ... }

장점:

  • 안전한 오류 처리, 모듈성 및 테스트 용이성 증가.

단점:

  • 값을 명시적으로 전달해야 하며, 코드가 다소 길어질 수 있습니다.