c中的字符串文字

为什么以下代码非法?

typedef struct{ char a[6]; } point; int main() { point p; pa = "onetwo"; } 

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

它与尺寸无关。 在创建char数组后,您无法将其分配给char数组 – 您只能在定义时使用它。

当你这样做

 char a[] = "something"; 

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

当你这样做

 char a[10]; a = "something"; 

你试图分配给arrays的地址,这是非法的。

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

 strcpy(pa, "12345");//give space for the \0 

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

 int foo[4]; int bar[4]; foo = bar; 

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

 pa[0] = 'o'; 

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

 strncpy(pa, "onetwo", 6); 

(请注意,char数组必须足够大以容纳nul-terminator,所以你可能想让它成为char a[7]并将strncpy的最后一个参数更改为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 

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

正如其他答案已经指出的那样,您只能使用字符串文字初始化字符数组,不能将字符串文字分配给字符数组。 然而,结构(甚至那些包含字符数组的结构)是另一个鱼的水壶。

我不建议在实际程序中执行此操作,但这表明虽然无法分配数组类型,但包含数组类型的结构可以。

 typedef struct { char value[100]; } string; int main() { string a = {"hello"}; a = (string){"another string!"}; // overwrite value with a new string puts(a.value); string b = {"a NEW string"}; b = a; // override with the value of another "string" struct puts(b.value); // prints "another string!" again } 

因此,在您的原始示例中,以下代码应该编译正常:

 typedef struct{ char a[6]; } point; int main() { point p; // note that only 5 characters + 1 for '\0' will fit in a char[6] array. p = (point){"onetw"}; } 

请注意,为了在数组中存储字符串“onetwo”,它必须长度为[7],而不是在问题中写入。 额外字符用于存储’\ 0’终止符。

不需要strcpy或C99 compund literal。 纯ANSI C中的示例:

 typedef struct{ char a[6]; } point; int main() { point p; *(point*)pa = *(point*)"onetwo"; fwrite(pa,6,1,stdout);fflush(stdout); return 0; }