프로그래밍C 개발자

C에서 변수 선언 및 초기화 규칙과 세부 사항, 다양한 저장 영역에 대한 자동 초기화 포함, 정의와 선언을 구별하는 방법 및 그 중요성에 대해 설명하십시오.

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

답변.

변수의 선언 및 초기화는 C 언어의 기초이며, 매우 엄격하고 때로는 명확하지 않은 규칙을 가집니다. 변수를 어떻게 그리고 어디서 선언했는지에 따라 초기값(초기화)와 메모리 객체와의 연결(선언과 정의)에 영향이 있습니다.

질문의 역사

C는 메모리 최적화가 우선시되던 시절로 거슬러 올라갑니다. 개발자는 변수를 스스로 선언하고 초기화해야 했으며, 그렇지 않으면 프로그램의 동작이 예측할 수 없게 되었습니다. 현대 C 컴파일러에서는 작은 편차도 링킹 오류나 "쓰레기"로의 암묵적 초기화로 이어질 수 있습니다.

문제

주요 오류는 다음과 같습니다:

  • 자동 변수는 기본적으로 초기화되지 않음
  • static 및 전역 변수는 0으로 자동 초기화됨
  • 선언과 정의를 혼동하여 다중 정의 또는 정의되지 않은 심볼이 발생함

해결책

  • 자동 (auto, 기본적으로 지역) 변수: 초기화되지 않음!
  • Static (static 함수, 파일 static, extern 없이 전역): 값이 지정되지 않으면 0으로 자동 초기화됨.
  • 선언: 컴파일러에게 변수의 존재를 알리며, 메모리는 예약되지 않음 (예: extern int x;)
  • 정의: 메모리를 예약하고 초기화될 수 있음 (또는 반드시 초기화되어야 함)(예: int x = 42;)

코드 예시:

#include <stdio.h> int global_var; // 정의, 자동 초기화 = 0 static int static_global_var; // static 파일, 자동 초기화 = 0 extern int extern_var; // 선언, 정의는 다른 곳에 존재 void foo() { int local_var; // 자동, 초기화되지 않음 -> 쓰레기 static int static_local_var; // static, 자동으로 0으로 초기화 }

주요 특징:

  • 변수의 위치가 자동 초기화에 영향을 미침
  • 정의와 선언은 동일하지 않음!
  • extern/비extern: 변수에 대해선 선언/정의, 함수에 대해선 오직 선언만 해당됨

함정 질문.

1. 자동 변수 (static도 extern 없는 지역 변수)는 컴파일러에 의해 자동으로 0으로 초기화되는가?

아니요, 쓰레기를 포함합니다. 초기화 전까지 사용하는 것은 오류입니다.

2. 다른 파일에서 extern으로 변수를 여러 번 정의할 수 있는가?

아니요, 하나의 정의가 필요하며, 나머지는 extern을 통한 선언이어야 함, 그렇지 않으면 링커가 "multiple definition" 또는 "undefined symbol" 오류를 발생시킵니다.

3. 함수의 선언과 정의는 무엇이 다른가?

선언은 오직 프로토타입(본체 없음)이며; 정의는 반드시 함수의 본체를 포함합니다. 변수의 경우 extern을 통한 선언은 메모리를 예약하지 않으며, 함수의 경우 두 형태 모두 허용됨.

일반적인 오류 및 안티 패턴

  • 자동 초기화 기대하는 로컬 변수
  • 헤더 파일에서 전역 변수를 다중 정의함
  • extern의 부적절한 사용

실제 사례

부정적인 경우

전역 변수 int counter;가 두 개의 헤더 파일에서 선언됨. 프로젝트가 multiple definition 오류로 링킹되었습니다.

장점:

  • 코드의 빠른 복사

단점:

  • 링킹 오류, 이해하기 어려운 컴파일러 메시지

긍정적인 경우

헤더에 extern int counter;가 작성되어 있고, 정의는 int counter = 0; — 오직 하나의 C 파일에서만 이루어집니다.

장점:

  • 깔끔한 컴파일, 논리적인 구조

단점:

  • 선언/정의의 분리에 대한 기억이 필요함