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) -- 프로그램이 예측할 수 없는 방식으로 작동하기 시작합니다.