问题描述
char *rows[][4] = {
{"A1","A2","A3"},{"B1","B2","B3"}
};
然后我想在此数组中更改一个char。以我有限的经验,我会这样:
rows[0][0][0] = 'G';
我希望“ A1”更改为“ G1”。相反,我遇到了段故障。 我该怎么办?
解决方法
此声明
char *rows[][4] = {
{"A1","A2","A3"},{"B1","B2","B3"}
};
声明一个多维数组,该数组包含指向字符串文字的指针。
您不得更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。
根据C标准(6.4.5字符串文字)
7不确定这些数组是否有区别,只要它们的 元素具有适当的值。 如果程序尝试执行以下操作 修改这样的数组,行为是不确定的
通过以下方式声明字符串数组
char rows[][4][3] = {
{"A1","B3"}
};
请注意,由于数组的第二维等于4
,而您只为子数组指定了三个初始化器,则声明看起来像
char rows[][4][3] = {
{"A1","A3",""},"B3",""}
};
现在您可以写
rows[0][0][0] = 'G';
,
如果您知道所有字符串的长度均为2,则可以使用以下代码:
char rows[2][3][3] = {
{"A1","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时,您需要rows [2] [3] [3]而不是rows [2] [3] [2],因为在c中,每个字符串都以“ \ 0”字符结尾。
如果要支持不同大小的字符串,也可以使用malloc创建字符串。让我知道是否需要有关此的更多信息。