为什么不能在数组中分配多个字符?

时间:2019-09-05 00:37:56

标签: c

采用以下示例尝试对数组进行字符分配:

char newer_string[3][6];
newer_string[0] = "One";
newer_string[0] = "Two";
newer_string[0] = "Three";

此操作失败,并显示以下错误:

main.c:46:18: error: array type 'char [6]' is not assignable

为什么必须一次添加每个人,例如“

char newer_string[3][6];
newer_string[0][0] = 'O';
newer_string[0][1] = 'n';
// ...etc...

将项目“附加”到空数组的最常用方法是什么?

另外,也许我误解了对2D数组(甚至是2D数组)的需求,因为我也可以做类似的事情:

char *newer_string[3];
newer_string[0] = "One";
newer_string[1] = "Two!!!";
newer_string[2] = "Three";

将多个“单词”分配给数组(2D字符数组或1D字符串指针数组?)的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

类型控制所有内容

不能将字符串“ *分配”给数组。可以将 String-Literal 的地址分配给指针。

声明char newer_string[3][6];时,将声明char的2D数组(一维数组的数组)。您可以在声明时初始化一个数组的内容,但是此后,您将无法分配该数组的内容。当您尝试将 String-Literal "One"的地址分配给数组时,编译器会正确抛出错误:

main.c:46:18: error: array type 'char [6]' is not assignable

(您的编译器是正确的,您正在尝试将类型char*分配给char[6]

请记住访问,除非用作sizeof的操作数或用于初始化数组,否则6.3.2.1(p3)苹果(请参见下文)将创建 String-Literal 类型char*(这是指向文字中第一个字符(的地址)的指针)。字符串字面量是不变的,任何修改的尝试都是未定义 C11 Standard - 6.4.5 String literals(p7),但是一些不合格的编译器提供了可变的字符串文字。

在访问时,您的2D数组将转换为指向第一个1D数组的指针。 C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3)的类型为char (*)[6]char[6]指针到数组)。当您使用[..]运算符取消引用指向数组的指针时,将剩下一个简单的数组。您不能分配数组的内容。

要复制到数组,请使用memcpy(或strcpy(如果需要一个 nul终止的字符串)),或循环使用分配每个字符的每个索引。 / p>

您的指针数组

在您进行编辑的情况下,char *newer_string[3];newer_string的类型为char *[3](一个指针数组 [3]-例如,一个3的数组指针)。您可以将 String-Literal 的地址分配给指针。类型兼容。

仔细检查一下,如果还有其他问题,请告诉我。