【问题标题】:Changing a character of a string in a 2D string array causes Segmentation fault更改二维字符串数组中的字符串字符会导致分段错误
【发布时间】:2020-10-12 16:46:12
【问题描述】:

我有一个 char* 的二维数组,如下所示:

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

然后我想改变这个数组中的一个字符。以我有限的经验,我会这样做:

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

我预计“A1”会更改为“G1”。相反,我得到了 Seg 错误。 我该怎么做?

【问题讨论】:

  • 你有一个 pointers 指向字符串字面量的数组,它们是只读的。您正在尝试将 'G' 写入其中一个字符串。您可以将数组元素更改为指向 不同的 字符串,例如 rows[0][0] = "G1";

标签: c multidimensional-array declaration c-strings string-literals


【解决方案1】:

此声明

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】:

    如果你知道所有字符串的长度都是 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 时,您需要 rows[2][3][3] 而不是 rows[2][3][2],因为在 c 中每个字符串都以 '\0' 字符结尾。

    如果您想支持不同大小的字符串,您也可以使用malloc 创建您的字符串。如果您想了解更多详情,请告诉我。

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 2019-01-28
      • 2017-08-02
      • 2015-06-23
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多