프로그래밍백엔드 C 개발자

C 언어에서 구조체 할당의 작동 특성에 대해 설명하세요. 구조체는 어떻게 복사되는지, 장점과 제한 사항은 무엇인지, 어떤 오류가 발생할 수 있는지 설명하십시오.

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

답변

C는 동일한 유형의 한 구조체를 다른 구조체에 직접 할당하는 것을 지원합니다: 모든 필드가 바이트 단위로 복사됩니다(memcpy). 이는 구조체를 신속하게 복제하는 데 유용합니다. 예:

struct Point { int x, y; }; struct Point p1 = {10, 20}; struct Point p2; p2 = p1; // 이제 p2.x=10, p2.y=20

특성:

  • 모든 필드가 "있는 그대로" 복사됩니다 (비트 단위).
  • 필드가 포인터/배열인 경우, 실제 데이터가 아닌 포인터 값만 복사됩니다 (깊은 복사가 이루어지지 않음!).
  • 할당은 동일한 유형의 구조체에 대해서만 작동합니다.

속임수가 있는 질문

"구조체가 동적으로 할당된 메모리를 가리키는 포인터를 포함하고 있고, 한 구조체를 다른 구조체에 할당하면 어떻게 될까요?"

많은 사람들이 모든 내용을 복사할 것이라고 생각하지만, 그렇지 않습니다.

답변: 포인터 값(주소)만 복사되고, 해당 주소의 데이터는 복사되지 않습니다. 두 구조체 객체는 동일한 메모리를 가리킵니다.

struct Data { int *arr; }; struct Data d1; d1.arr = malloc(10 * sizeof(int)); struct Data d2 = d1; // d2.arr == d1.arr

d2.arr를 변경하면 d1.arr가 보는 메모리가 변경됩니다.

이 주제의 세부사항을 모르고 발생한 실제 오류 예


이야기 1

데이터 직렬화: 내부 버퍼 포인터가 있는 구조체를 할당했지만 복사한 후 서로 다른 두 객체가 동일한 메모리를 가리키면서 두 번 해제하려고 하였습니다. 결과는 double free와 서비스 충돌.


이야기 2

복잡한 구조체를 복제하려고 시도하면서 포인터 필드에 대한 깊은 복사를 수행하는 것을 잊었습니다. 복사본을 변경한다고 해서 독립성이 유지될 것으로 기대했지만 원본이 변경되었고(반대로도 마찬가지), 데이터의 일관성을 잃었습니다.


이야기 3

문자열을 가리키는 중첩 포인터가 있는 구조체를 보관했습니다. 구조체를 할당한 후 문자열 중 하나를 해제하였더니 다른 구조체가 갑자기 "잘못되었습니다"(dangling pointer) -- 프로그램이 예측할 수 없는 방식으로 작동하기 시작합니다.