为什么以下代码是非法的?
typedef struct{
char a[6];
} point;
int main()
{
point p;
p.a = "onetwo";
}
这是否与文字大小有关?还是只是在声明char数组之后将字符串文字赋值给它是非法的?
typedef struct{
char a[6];
} point;
int main()
{
point p;
p.a = "onetwo";
}
这是否与文字大小有关?还是只是在声明char数组之后将字符串文字赋值给它是非法的?
这与大小无关。在创建后,您不能将字符串字面值分配给char数组 - 只能在定义时使用它。
当您执行以下操作时:
char a[] = "something";
它创建了一个足够大小的数组(包括终止空字符),并将字符串复制到该数组中。在使用字符串字面值初始化数组时指定数组大小不是一个好习惯 - 可能没有考虑到空字符。
当你这样做时
char a[10];
a = "something";
你试图对数组的地址进行赋值,这是不合法的。
编辑:如其他答案中所提到的,你可以使用strcpy/strncpy,但一定要确保数组已经初始化为所需的长度。
strcpy(p.a, "12345");//give space for the \0
在数组创建后,您永远无法对其进行赋值;以下方式同样是不合法的:
int foo[4];
int bar[4];
foo = bar;
p.a[0] = 'o';
如果你想在结构体中留下一个数组,你可以使用像 strcpy
这样的函数:
strncpy(p.a, "onetwo", 6);
(注意字符数组需要足够大以容纳空终止符,因此您可能希望将其设为char a[7]
并将最后一个参数更改为strncpy
为7)
strcpy
解决方案中编辑的答案。 - Michael Mrozek数组是不可修改的左值(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"};
}
struct
的示例给予加分,但请注意这些复合字面量是 C99 的新增功能。('//' 样式的注释也是如此。) - schot不需要使用strcpy或C99复合字面量。这是一个纯ANSI C的示例:
typedef struct{
char a[6];
} point;
int main()
{
point p;
*(point*)p.a = *(point*)"onetwo";
fwrite(p.a,6,1,stdout);fflush(stdout);
return 0;
}