![](/img/trans.png)
[英]Segmentation fault when trying to get a character from a string in a 2D array
[英]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.