簡體   English   中英

更改二維字符串數組中字符串的字符會導致分段錯誤

[英]Changing a character of a string in a 2D string array causes Segmentation fault

我有一個像這樣創建的 char* 二維數組:

char *rows[][4] = {
    {"A1","A2","A3"},
    {"B1","B2","B3"}
};

然后我想改變這個數組中的一個字符。 以我有限的經驗,我會這樣做:

rows[0][0][0] = 'G';

我希望“A1”變成“G1”。 相反,我得到了一個 Seg 錯誤。 我該怎么做呢 ?

本聲明

char *rows[][4] = {
    {"A1","A2","A3"},
    {"B1","B2","B3"}
};

聲明一個指向字符串文字的多維指針數組。

您不能更改字符串文字。 任何更改字符串文字的嘗試都會導致未定義的行為。

來自 C 標准(6.4.5 字符串文字)

7 如果這些數組的元素具有適當的值,則未指定這些數組是否不同。 如果程序嘗試修改這樣的數組,則行為未定義

按以下方式聲明字符串數組

char rows[][4][3] = {
    {"A1","A2","A3"},
    {"B1","B2","B3"}
};

請注意,因為數組的第二維等於4而您只為子數組指定了三個初始化器,那么聲明看起來像

char rows[][4][3] = {
    {"A1","A2","A3", ""},
    {"B1","B2","B3", ""}
};

現在你可以寫

rows[0][0][0] = 'G';

如果您知道所有字符串的長度為 2,則可以使用以下命令:

  char rows[2][3][3] = {
    {"A1","A2","A3"},
    {"B1","B2","B3"}
  };
  printf("%c\n", rows[0][0][0]); //Prints "A"
  printf("%s\n", rows[0][0]); //Prints "A1"

  rows[0][0][0] = 'G';

  printf("%c\n", rows[0][0][0]); //Prints "G"
  printf("%s\n", rows[0][0]); //Prints "G1"

請注意,當字符串長度為 2 時,您需要行 [2][3][3] 而不是行 [2][3][2],因為在 c 中每個字符串都以 '\\0' 字符結尾。

如果你想支持不同大小的字符串,你也可以使用malloc創建你的字符串。 如果您想了解更多詳情,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM