我有一个带有两个字段的结构,这些字段本身就是结构。我想使用初始化列表来分配内部结构的字段,而不必手动分配每个字段。
struct point
{
int x;
int y;
};
struct rectangle
{
struct point p1;
struct point p2;
};
struct rectangle r2;
r2.p1 = {5, 6};
r2.p2 = {7, 20};
但是这段代码不会编译:
structs3.c:105:11: error: expected expression before ‘{’ token
r2.p1 = {5, 6};
^
structs3.c:106:11: error: expected expression before ‘{’ token
r2.p2 = {7, 20};
^
为什么这不起作用?是什么原因?
答案 0 :(得分:6)
您可以在定义r2
时执行此操作,例如
struct rectangle r2 = {
{5, 6},
{7, 20}
};
或使用
中的compound literalsr2.p1 = (struct point){5, 6};
r2.p2 = (struct point){7, 20};
答案 1 :(得分:3)
你所拥有的不是初始化,而是一项任务。初始化必须直接在声明变量的地方完成,在本例中为struct rectangle r2;
。
您可以通过嵌套{}
:
struct rectangle r2 = {
{5, 6},
{7, 20},
};
答案 2 :(得分:2)
原因在于C { 5, 6 }
本身不是表达式,它本身不能用作表达式中的操作数。 { ... }
列表只能在声明或复合文字中用作初始化语法的一部分。
因此,如果您想特别使用赋值,则必须使用复合文字
struct rectangle r2;
r2 = (struct rectangle) { { 5, 6 }, { 7, 20 } };
可选择使用指示符
struct rectangle r2;
r2 = (struct rectangle) { .p1 = { 5, 6 }, .p2 = { 7, 20 } };
或者,单独分配子结构
struct rectangle r2;
r2.p1 = (struct point) { 5, 6 };
r2.p2 = (struct point) { 7, 20 };
同样,如果您愿意,可以将其表达为
struct rectangle r2;
r2.p1 = (struct point) { .x = 5, .y = 6 };
r2.p2 = (struct point) { .x = 7, .y = 20 };
答案 3 :(得分:0)
我想补充一下这个问题。 初始化意味着在首次声明/定义变量时为变量赋予初始值。 C中的初始化列表仅在第一次声明/定义变量时有效。赋值意味着在变量已经声明/定义之后给变量赋值,在代码中较低的位置。
1. struct rectangle r2;
2. r2.p1 = {5, 6};
3. r2.p2 = {7, 20};
struct rectangle对象的初始化在第1行。执行该行之后,现在在内存中创建了struct。在这种情况下,我们无法使用初始化列表,因为这是一个赋值。 我会编写一些程序员老兄的建议。
1. struct rectangle r2 = { {5, 6}, {7, 20} };
请注意,它适合一行。这是初始化! 我可以改变上面的代码。请注意,初始化后还可以有任何其他代码行。我想证明这是一项任务。
1. struct rectangle r2;
2. int x = 1 + 2;
3. printf("Hello World\n");
4. r2.p1 = {5, 6};
5. r2.p2 = {7, 20};