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

C 語言三維字元陣列動態配置與 strcpy 段錯誤解析

     編輯:程式設計綜合問答

問題現象

使用三級指標 char *** 動態配置三維陣列,嘗試用 strcpy(table[0][0], "num") 複製字串,程式發生段錯誤(Segmentation Fault)。

核心問題

  1. 記憶體不連續:多層 malloc 配置的記憶體塊之間不保證連續,無法像靜態陣列 arr[i][j][k] 那樣直接索引。
  2. 區域變數生命週期:Create3DActiveArray 內的 pArr 是區域指標,函數返回後棧框銷毀,導致回傳指標指向無效記憶體。
  3. 迴圈索引錯誤:原始碼中 for (j = 2; j < y; j++) 應為 j = 0,導致部分指標未初始化。

正確配置策略

改用「指標的指標」層層配置,並透過 char **** 輸出參數將配置好的記憶體位址帶回 main:

void Create3DActiveArray(char ****pArr, int x, int y, int z)
{
    *pArr = (char ***)malloc(x * sizeof(char **));
    char ***p3 = *pArr;
    for (int i = 0; i < x; i++) {
        *p3 = (char **)malloc(y * sizeof(char *));
        char **p2 = *p3;
        for (int j = 0; j < y; j++) {
            *p2 = (char *)malloc(z * sizeof(char));
            char *p1 = *p2;
            for (int k = 0; k < z; k++) {
                *p1 = 0;
                p1++;
            }
            p2++;
        }
        p3++;
    }
}

使用範例

int main() {
    char ***table;
    Create3DActiveArray(&table, 2, 2, 4);
    strcpy(*(*table), "num");  // 等同 table[0][0]
    printf("%s\n", *(*table));
    // 釋放記憶體...
    return 0;
}

釋放記憶體

依反向順序逐層 free,並將指標設為 NULL 避免野指標。

總結

多維動態陣列需注意記憶體連續性、指標生命週期與索引正確性。建議優先考慮一維陣列模擬多維,或使用 C++ std::vector 簡化管理。

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