C 언어의 구조체(structure)는 사용자가 직접 정의하는 데이터 타입을 만들 수 있게 해주는 강력한 기능입니다. 구조체의 멤버는 int나 char 같은 기본(primitive) 타입일 수도 있고, 정적으로 할당된 배열일 수도 있습니다.
구조체 변수를 다른 변수에 대입하면 일반적으로 얕은 복사(shallow copy)가 수행됩니다. 하지만 여기에는 중요한 예외가 하나 있습니다. 바로 구조체 멤버가 배열인 경우입니다. 이때는 컴파일러가 자동으로 깊은 복사(deep copy)를 수행하여 배열의 모든 요소 값이 통째로 복사됩니다.
즉, 복사된 구조체에서 배열 멤버의 값을 변경해도 원본 구조체의 배열에는 아무런 영향을 주지 않습니다. 다음 예제를 통해 이 동작을 확인해 보겠습니다.
예제 코드
#include <stdio.h>
#include <string.h>
typedef struct student {
int roll_num;
char name[128];
} student_t;
void print_struct(student_t *s) {
printf("Roll num: %d, name: %s\n", s->roll_num, s->name);
}
int main() {
student_t s1, s2;
s1.roll_num = 1;
strcpy(s1.name, "tom");
// 구조체 대입: name 배열은 deep copy로 복사됨
s2 = s1;
// s1의 내용은 영향받지 않음 (배열에 대해 deep copy가 수행되었기 때문)
s2.name[0] = 'T';
s2.name[1] = 'O';
s2.name[2] = 'M';
print_struct(&s1);
print_struct(&s2);
return 0;
}실행 결과
위 코드를 컴파일하고 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
Roll num: 1, name: tom Roll num: 1, name: TOM
동작 원리 정리
- 구조체 변수 간 대입(
s2 = s1;) 시 기본적으로 값이 그대로 복사됩니다. - 멤버가 정적 배열(예:
char name[128])이라면 배열 전체 내용이 복사되므로 사실상 deep copy처럼 동작합니다. - 반면 멤버가 포인터(예:
char *name)라면 포인터 주소값만 복사되는 shallow copy가 되어, 두 구조체가 같은 메모리를 공유하게 됩니다. - 따라서 위 예제에서
s2.name을 변경해도s1.name은 그대로 "tom"으로 유지됩니다.
이처럼 C 언어에서 구조체 내부의 고정 크기 배열은 대입 연산만으로도 안전하게 전체 복사가 이루어지며, 이는 문자열이나 버퍼를 구조체 멤버로 관리할 때 유용하게 활용됩니다.