c中的字符串文字

oss*_*sau 7 c

为什么下面的代码是非法的?

typedef struct{
   char a[6];
} point;

int main()
{
   point p;
   p.a = "onetwo";
}
Run Code Online (Sandbox Code Playgroud)

它与文字的大小有什么关系吗?或者在声明后将字符串文字分配给char数组是否违法?

Ama*_*osh 12

它与尺寸无关.在创建char数组后,不能将其分配给char数组 - 只能在定义时使用它.

当你这样做

char a[] = "something";
Run Code Online (Sandbox Code Playgroud)

它创建一个足够大小的数组(包括终止null)并将字符串复制到数组中.使用字符串文字初始化时,指定数组大小不是一个好习惯 - 您可能不会考虑空字符.

当你这样做

char a[10];
a = "something";
Run Code Online (Sandbox Code Playgroud)

你试图分配给阵列的地址,这是非法的.

编辑:如其他答案中所述,您可以执行strcpy/strncpy,但请确保使用所需的长度初始化数组.

strcpy(p.a, "12345");//give space for the \0
Run Code Online (Sandbox Code Playgroud)


Mic*_*zek 7

在创建数组后,您永远不能分配它们; 这同样是非法的:

int foo[4];
int bar[4];
foo = bar;
Run Code Online (Sandbox Code Playgroud)

您需要使用指针,或分配给数组的索引; 这是合法的:

p.a[0] = 'o';
Run Code Online (Sandbox Code Playgroud)

如果你想在结构中留下一个数组,你可以使用如下函数strcpy:

strncpy(p.a, "onetwo", 6);
Run Code Online (Sandbox Code Playgroud)

(请注意,char数组必须足够大以容纳nul-terminator,所以你可能想要它char a[7]并将最后一个参数更改strncpy为7)


Pra*_*rav 7

数组是non modifiable lvalues.所以你不能分配给他们.赋值运算符的左侧必须是modifiable lvalue.

但是,您可以在定义数组时初始化该数组.

例如 :

 char a[] = "Hello World" ;// this is legal
 char a[]={'H','e','l','l','o',' ','W','o','r','l','d','\0'};//this is also legal

 //but

 char a[20];
 a = "Hello World" ;// is illegal 
Run Code Online (Sandbox Code Playgroud)

但是你可以使用 strncpy(a, "Hello World",20);

  • 如果在数组被"定义"(而不是"声明")时使用正确的术语"初始化"而不是"赋值",则会更清楚. (2认同)
  • @Jonathan:是的,你是迂腐的.固定!:) (2认同)