为什么我得到:“错误:分配给具有数组类型的表达式”

1 c arrays pointers initialization variable-assignment

#include <stdio.h>\n\nint main(void) {\n    int arr[10];\n    arr = "Hello";\n    printf("%s",arr);\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的代码显示编译器错误:

\n\n
t.c: In function \xe2\x80\x98main\xe2\x80\x99:\nt.c:5:9: error: assignment to expression with array type\n     arr = "Hello";\n         ^\nt.c:6:12: warning: format \xe2\x80\x98%s\xe2\x80\x99 expects argument of type \xe2\x80\x98char *\xe2\x80\x99, but argument 2 has type \xe2\x80\x98int *\xe2\x80\x99 [-Wformat=]\n     printf("%s",arr);\n            ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

而下面的代码工作正常。

\n\n
#include <stdio.h>\n\nint main(void) {\n    char arr[10] = "Hello";\n    printf("%s",arr);\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

两者在我看来都一样。我在这里缺少什么?

\n

Sou*_*osh 6

它们并不相同。

首先,使用int字符串文字初始化数组毫无意义,在最坏的情况下,它可能会调用未定义的行为,因为指向整数转换的指针以及此后转换结果的有效性是高度特定于平台的行为。从这一点来看,这两个片段都是无效的。

然后,考虑char使用数组,更正数据类型,

是一个赋值,对于数组类型作为赋值的 LHS 是不允许的。

是一个初始化语句,这是完全有效的语句。