C 語言結構體指標傳遞函數:解構指標複製與直接賦值的編譯器行為
結構體指標複製函數
void copy_teacher(Teacher *dst, const Teacher *src) {
*dst = *src; // 解參考賦值:觸發逐成員複製
}
編譯器行為解析
*dst = *src 對結構體型別,編譯器產生 逐成員複製 代碼 (等同 memcpy(dst, src, sizeof(Teacher)))。
- 若結構體含指標成員,屬於淺拷貝,指向同一記憶體,需自行深拷貝。
- 直接賦值
t2 = t1 與 copy_teacher(&t2, &t1) 效果完全相同。
完整範例
#include <stdio.h>
#include <string.h>
typedef struct { char name[64]; int age, id; } Teacher;
void copy_teacher(Teacher *dst, const Teacher *src) { *dst = *src; }
int main() {
Teacher t1 = {"Alice", 30, 1};
Teacher t2, t3;
t2 = t1; // 直接賦值
copy_teacher(&t3, &t1); // 函數指標複製
printf("t2: %s %d\n", t2.name, t2.age);
printf("t3: %s %d\n", t3.name, t3.age);
return 0;
}
進階:含動態成員的深拷貝
typedef struct {
char *name; // 動態分配
int age;
} Person;
void deep_copy(Person *dst, const Person *src) {
dst->age = src->age;
dst->name = malloc(strlen(src->name)+1);
strcpy(dst->name, src->name);
}
void free_person(Person *p) { free(p->name); }
總結
- 無動態成員:
*dst = *src / dst = src 皆可,編譯器處理複製。
- 有動態成員:必須手寫深拷貝,並提供對應釋放函數。
- 函數參數用
const Teacher *src 防止誤修改來源。