首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言結構體中指針與數組成員的初始化陷阱

     編輯:程式設計綜合問答

問題代碼

struct Word {
    char *word1;      // 指針成員
    int line[1000];   // 數組成員
};

struct Word danci;
getword(danci, 100); // 傳值調用!
printf("%d", danci.line[0]); // 報錯:未初始化

三大錯誤

  1. 傳值調用導致修改失效:getword(struct Word word, ...) 參數為值傳遞,函數內修改的是副本,**原結構體完全不變**。必須傳指針:getword(struct Word *word, ...)。
  2. 指針成員未分配內存:char *word1 只是野指針,寫入前必須 word1 = malloc(MAX_LEN) 或指向已有緩衝區。
  3. 函數內聲明函數: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;
}

指針 vs 內嵌數組 選型指南

場景推薦理由
最大長度固定且較小(< 1KB)內嵌數組零分配、零釋放、緩存友好
長度不定、可能很大指針 + malloc節省內存、支持動態擴容
結構體頻繁傳值/拷貝內嵌數組淺拷貝即正確,指針需深拷貝

初學者**優先用內嵌數組**,避開 malloc/free、淺拷貝、野指針三大坑。等掌握內存管理後再引入指針成員。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved