프로그래밍Embedded C 개발자

C에서 다양한 저장 유형(자동, 정적, 전역)의 변수를 어떻게 초기화합니까? 이는 프로그램의 안전성과 정확성에 어떤 영향을 미칩니까?

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

답변

C 언어에서 변수는 저장 specifier에 따라 다르게 초기화됩니다:

  • 자동(지역) 변수: 명시적으로 초기 값을 지정하지 않으면 초기화되지 않은(쓰레기) 값을 가집니다. 그 내용물은 이전에 사용된 스택 메모리입니다.
  • 정적 지역 및 전역 변수 (static, extern): 항상 0 (스칼라의 경우 0, 포인터의 경우 NULL)으로 초기화되거나 링킹 단계에서 지정된 값으로 초기화됩니다.

차이점의 예:

void example() { int a; // 자동, 초기화되지 않음 static int b; // 0으로 초기화됨 printf("a=%d, b=%d ", a, b); } int c; // 전역, 0으로 초기화됨

초기화에 대한 잘못된 가정에서 오류가 발생합니다. 안전을 위해 항상 변수를 명시적으로 초기화하십시오.

트릭 질문

함수 수준에서 블록 외부에 선언된 자동 지역 변수는 0으로 초기화됩니까?

답변:

아니요! 변수가 함수의 시작 부분에 선언되었더라도 명시적인 초기화가 없다면 쓰레기를 가집니다:

void f() { int x; printf("%d ", x); // UB: x 초기화되지 않음 }

주제의 세부 사항을 모르는 경우 실제 오류의 예


이야기

은행 소프트웨어에서 함수 내의 다음 카운터의 초기화를 놓친 결과 때때로 큰 음수로 나타났습니다 — 결과: 고객에게 잘못된 보너스가 부여되었고, 이 버그는 실제 데이터에서만 발견되었습니다.


이야기

오래된 멀티미디어 이미지 처리기는 정적 배열이 항상 0으로 채워진다고 가정했습니다. 다른 컴파일러(비표준 환경)로 전환한 후 세그멘테이션 오류가 발생했습니다 — 메모리 일부가 프로세스에 물리적으로 할당되지 않았습니다.


이야기

암호화 라이브러리에서 개발자는 글로벌 섹션의 버퍼가 0으로 채워져 있다고 생각하여 비밀번호의 임시 버퍼를 초기화하지 않았습니다. 그러나 이전의 민감한 데이터가 남아 있는 메모리와 관련된 사건이 발생하여 비밀번호가 덤프 시 유출되었습니다.