struct Word {
char *word1; // 指針成員
int line[1000]; // 數組成員
};
struct Word danci;
getword(danci, 100); // 傳值調用!
printf("%d", danci.line[0]); // 報錯:未初始化
getword(struct Word word, ...) 參數為值傳遞,函數內修改的是副本,**原結構體完全不變**。必須傳指針:getword(struct Word *word, ...)。char *word1 只是野指針,寫入前必須 word1 = malloc(MAX_LEN) 或指向已有緩衝區。int c, getch(void); 在函數體內聲明外部函數屬於舊式 K&R 風格,現代 C 標準建議在文件頂部 #include 後聲明。#define MAX_WORD_LEN 100
#define MAX_LINES 1000
struct Word {
char word1[MAX_WORD_LEN]; // 直接內嵌數組,避免 malloc
int line[MAX_LINES];
int lineCount; // 記錄實際行數
};
void getword(struct Word *w, int lim) {
// 實現邏輯...
// w->word1 直接寫入
// w->line[w->lineCount++] = currentLine;
}
int main() {
struct Word danci = {0}; // 零初始化所有成員
getword(&danci, MAX_WORD_LEN);
printf("First line: %d\n", danci.line[0]);
return 0;
}
| 場景 | 推薦 | 理由 |
|---|---|---|
| 最大長度固定且較小(< 1KB) | 內嵌數組 | 零分配、零釋放、緩存友好 |
| 長度不定、可能很大 | 指針 + malloc | 節省內存、支持動態擴容 |
| 結構體頻繁傳值/拷貝 | 內嵌數組 | 淺拷貝即正確,指針需深拷貝 |
初學者**優先用內嵌數組**,避開
malloc/free、淺拷貝、野指針三大坑。等掌握內存管理後再引入指針成員。