更改2D字符串数组中字符串的字符会导致分段错误

问题描述

我有一个像这样创建的char *二维数组:

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创建字符串。让我知道是否需要有关此的更多信息。