首页 > 解决方案 > 影响堆中另一个结构中的“静态”结构

问题描述

所以我解决了我的问题,并不难,但我在徘徊为什么第一个版本不起作用。所以在这里,我的问题的一个例子:

typedef struct a {
    int i;
}   A;

typedef struct b {
    int i;
    A a;
}   B;

typedef B * PB;

PB create_B(int ia, int ib) {
    PB b = malloc(sizeof(B));
    b->i = ib;
    b->a = {ia};
}

我从编译器那里得到一个错误说:

“错误:'{'标记之前的预期表达式”

在行:b->a = {ia};

但我真的不明白是什么问题。

我解决了它铸造结构:

PB create_B(int ia, int ib) {
    PB b = malloc(sizeof(B));
    b->i = ib;
    b->a = (A){ia};
}

但是类型定义明确,不是吗?我的意思是,对我来说,很明显 {ia} 属于 A 类型,因为 b->a 也属于 A 类型。

最后一句话我可能错了(编译器可能是对的)。因此,如果您有一个示例,其中这种情况并不明显并且确实需要演员表,那将非常感激,或者至少只是一个解释。

感谢您的时间。

巴里奥特

PS:我想我也可以这样做

PB create_B(int ia, int ib) {
    PB b = malloc(sizeof(B));
    *b = (B){ib, {ia}};
}

但我仍然需要一个演员...

标签: c

解决方案


{ia}不是 C 中的表达式,不能在表达式语句中使用。

{ia}是定义语法的一部分。在定义中,可以在 . 后面的大括号中给出初始值列表=。(初始化标量对象时可以省略大括号。)这是在定义中初始化的特殊语法,而不是像=在表达式中使用的赋值。

(A){ia}是一个表达式;它是一种称为复合文字的构造。在括号中的类型名称之后,在大括号内给出初始值。这将创建一个指定类型的对象。然后可以在表达式中使用该对象,例如赋值的右操作数。


推荐阅读