在C语言中为字符数组分配直接字符串

在C语言中为字符数组分配直接字符串,c,arrays,string,variable-assignment,C,Arrays,String,Variable Assignment,在2D数组中,将直接字符串分配给char数组,会得到一个错误 char name[5][10]; name[0] = "hello"; 但是,使用strcpy,将字符串复制到char数组可以正常工作 char name[5][10]; strcpy(name[0],"hello"); 为什么第一种情况不起作用?因为数组类型不是可修改的左值,因此不能“赋值” 赋值运算符需要一个可修改的左值作为LHS操作数 相关,引用章节§6.5.16中的C11 赋值运算符应具有可修改的左值作为其左操作数 以及

在2D数组中,将直接字符串分配给char数组,会得到一个错误

char name[5][10];
name[0] = "hello";
但是,使用strcpy,将字符串复制到char数组可以正常工作

char name[5][10];
strcpy(name[0],"hello");

为什么第一种情况不起作用?

因为数组类型不是可修改的左值,因此不能“赋值”

赋值运算符需要一个可修改的左值作为LHS操作数

相关,引用章节§6.5.16中的
C11

赋值运算符应具有可修改的左值作为其左操作数

以及第§6.3.2.1章

[…]可修改左值是指 没有数组类型,没有不完整的类型,没有常量 类型,并且如果它是结构或联合体,则没有任何成员(包括, 递归地,所有包含的聚合或联合的任何成员或元素)具有常量 类型

在您的例子中,对于定义为

char name[5][10];

元素
name[0]
的类型为
char[10]
,即10
char
s的数组。

,因为C不允许分配给数组。这是语言的局限性

请注意,可以分配给
结构
,即使它包含一个数组:

#include <stdio.h>
struct x
{
    char s[20];
};

int main(void)
{
    struct x x;
    x = (struct x){ "test" };
    puts(x.s);
}
#包括
结构x
{
chars[20];
};
内部主(空)
{
结构x;
x=(结构x){“测试”};
看跌期权(x.s);
}

像这样的问题太多了。我们能不能再多问一次?这太倾向于C++了。DUP@Michi的确,但现在它已经关闭了,我正在考虑它,一定有一个…希望修复了dupe链接到合适的东西可能它会很有趣地提到
strcpy
,以及它是如何工作的。然后,OP可能会更清楚地理解为什么它可以使用strcpy,为什么它不能使用它的方法@好吧,那太多了(太宽了)。OP已经声称知道为什么strcpy可以工作,但不能直接分配。