为什么这在C中是非法的?将p重新初始化为不同的位置有什么问题?通过单独更改字段值可以实现相同的效果,因此我不明白为什么不能在p = {1,2}的情况下一步完成。
struct posn {
int x;
int y;
};
int main() {
struct posn p = {3, 4};
p = {1, 2}; //Causes error
// must do p.x = 1; p.y = 2;
return 0;
}
答案 0 :(得分:5)
指明语言的方式。
为了与C&C的一般设计保持一致,为了允许p = {1, 2}
,{1, 2}
必须是一个表达式。但是什么类型的?它可能是int[2]
,或struct { int a; short s; }
,或许多其他内容。
使用C99,可以使用复合文字,它明确提到类型(从而解决了如何确定类型的问题),括号内的类型名称后跟{}
括号中的初始值设定项: / p>
p = (struct posn){1, 2};
答案 1 :(得分:4)
您可以使用复合文字。例如
#include <stdio.h>
struct posn
{
int x;
int y;
};
int main(void)
{
struct posn p = { 3, 4 };
p = ( struct posn ){ 1, 2 };
printf( "p.x = %d, p.y = %d\n", p.x, p.y );
return 0;
}
程序输出
p.x = 1, p.y = 2
这是有效的,因为与数组相对的结构具有复制赋值运算符。 但是,您可以在结构中包含一个数组,并使用相同的技巧重新分配数组。
这是一个例子
#include <stdio.h>
struct posn
{
int a[2];
};
int main(void)
{
struct posn p = { { 3, 4 } };
p = ( struct posn ){ { 1, 2 } };
printf( "p.a[0] = %d, p.a[1] = %d\n", p.a[0], p.a[1] );
return 0;
}
因此它在C ++中看起来像std::array
。)
答案 2 :(得分:0)
这不完全正确,你不能使用初始化列表,但你当然可以随时初始化或更精确地更改结构的成员,试试这个
p.x = 1;
p.y = 2;
初始化列表只能是声明的一部分。