初始化Malloc分配的结构体。

8
我正在尝试使用大括号来初始化一个结构体,但我实际上是想初始化由从malloc调用返回的指针所指向的结构体。
typedef struct foo{
    int x;
    int y;
} foo;

foo bar = {5,6};

我知道如何做,但我需要在这个背景下完成。

foo * bar = malloc(sizeof(foo));
*bar = {3,4};

6
这段代码的意思是将一个名为 foo 的结构体变量初始化为 {3, 4},然后将其赋值给指针 bar 所指向的内存地址。 - BLUEPIXY
谢谢,这个有效! - AndrewGrant
2个回答

9

这个问题已经在评论中得到了解答,因此我们将其转换为共识。

您需要对赋值操作符右侧进行类型转换,示例如下:

*bar = (foo) {3,4};

如评论中 @cremno 所指出的,这不是一次类型转换,而是一个复合字面量的赋值。
C99 标准中相关的部分为:6.5.2.5 复合字面量,它表示:
一个后缀表达式由带圆括号的类型名和一对花括号包含的初始化列表组成。它提供了一个无名对象,其值由初始化列表给出。

6
它看起来像一个强制类型转换符,但实际上它不是。整个东西是一个复合字面量。 - cremno
@cremno 看起来是这样。说得好。我已经更新了答案,并附上了标准的参考。 - jpw
作为一个显著的奖励:任何你在复合字面值初始化器中忘记包含的结构成员都会默认被零初始化(就像它们是静态对象一样)。请参见:https://dev59.com/c4Hba4cB1Zd3GeqPWdap#24936301 - 6equj5

1

bar是一个指针,它持有对malloced foo结构体的引用。

使用bar->x=3;bar->y=4


我理解如何像那样初始化,但我特别寻找花括号初始化。 - AndrewGrant
在这种情况下,*bar = (foo) {3,4}; 应该可以工作。演示 - Shreyas Chavan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接