兩種宣告方式
// 方式一:字元陣列 (內建儲存空間)
struct info {
char first[20];
char last[20];
int age;
};
// 方式二:字元指標 (僅存指標)
struct pinfo {
char *first;
char *last;
int age;
};
記憶體佈局差異
| 特性 | char first[20] | char *first |
| 結構體大小 | 包含 20+20+4 = 44 bytes | 包含 4+4+4 = 12 bytes (64位元為 24) |
| 字串儲存位置 | 結構體內部 | 外部 (需自行 malloc) |
| 初始化 | {"John", "Doe", 25} | 指向字串常量區 (唯讀) |
| 修改字串 | 直接修改 | 若指向常量區 → 未定義行為 |
| 動態長度 | 固定上限 | 彈性 (配合 malloc/realloc) |
指標版正確用法:動態配置
void setinfo(struct pinfo *p, const char *fn, const char *ln, int age) {
p->first = malloc(strlen(fn) + 1);
strcpy(p->first, fn);
p->last = malloc(strlen(ln) + 1);
strcpy(p->last, ln);
p->age = age;
}
void clean(struct pinfo *p) {
free(p->first);
free(p->last);
}
使用範例
struct pinfo person;
setinfo(&person, "Alice", "Wang", 30);
printf("%s %s, %d\n", person.first, person.last, person.age);
clean(&person);
選擇建議
- 固定長度、生命週期簡單 → 字元陣列
- 可變長度、頻繁修改、共享字串 → 字元指標 + malloc/free
- 嵌入式/效能敏感 → 字元陣列避免堆碎片