프로그래밍C 개발자

C 언어의 자동 (auto) 저장 영역에서 메모리 작업의 특징에 대해 설명하십시오. 스택에 위치한 변수를 사용할 때 발생할 수 있는 어려움은 무엇입니까?

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

답변

C 언어에서 자동 저장 영역 (auto, 기본값) 변수는 가시성 영역에 들어갈 때 (일반적으로 함수) 스택에 생성되며, 해당 영역을 벗어날 때 자동으로 파괴됩니다.

특징은 다음과 같습니다:

  • 해당 변수에 대한 접근은 선언된 블록 내에서만 가능합니다.
  • 스택의 크기는 한정되어 있으며, 오버플로우 발생 시 충돌이 발생합니다 (stack overflow).
  • 함수에서 자동 변수의 주소를 반환하면 정의되지 않은 동작을 초래합니다.

올바른 사용과 잘못된 사용 예:

int* wrong() { int x = 42; return &x; // 오류: x는 함수에서 벗어날 때 파괴됩니다. } void correct() { int y = 123; printf("%d\n", y); // 모두 정상 }

속임수 질문

함수에서 지역 변수의 주소를 반환하면 어떻게 됩니까?

종종 잘못된 답변: "포인터가 값을 유지합니다."

올바른 답변: 반환된 주소는 함수가 종료된 후 무효화되고, 메모리 영역은 다른 자동 변수나 함수에 다시 할당됩니다. 그런 포인터 사용은 정의되지 않은 동작입니다.

예:

int* myfunc() { int temp = 10; return &temp; // temp는 반환 후 파괴됩니다. } int main() { int* p = myfunc(); printf("%d\n", *p); // 정의되지 않은 동작 }

주제에 대한 세부 사항을 모르는 실수의 예


이야기

대규모 은행 시스템 프로젝트에서 프로그래머는 결과 처리를 위해 사용자 함수에서 지역 배열에 대한 포인터를 반환했습니다. 시스템은 불안정하게 작동했으며, 데이터가 주기적으로 손상되거나 예기치 않게 변경되어 보고서에서 비용이 많이 드는 버그가 발생했습니다.

이야기

주변 장치 드라이버 코드에서 프로그래머는 비동기 전송을 위해 스택 버퍼를 사용했습니다. 전송 시작과 완료 사이의 지연으로 인해 데이터가 손상되었으며, 버퍼가 작업 완료 전에 파괴되었습니다.

이야기

의료 기록 장치의 펌웨어에서는 데이터 처리 속도를 높이기 위해 스택에 캐시를 구현했습니다. 부하가 걸릴 때 스택이 오버플로우되어 장치 재부팅과 환자 데이터 손실이 발생했습니다.