c - 影响堆中另一个结构中的“静态”结构
问题描述
所以我解决了我的问题,并不难,但我在徘徊为什么第一个版本不起作用。所以在这里,我的问题的一个例子:
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}};
}
但我仍然需要一个演员...
解决方案
{ia}
不是 C 中的表达式,不能在表达式语句中使用。
{ia}
是定义语法的一部分。在定义中,可以在 . 后面的大括号中给出初始值列表=
。(初始化标量对象时可以省略大括号。)这是在定义中初始化的特殊语法,而不是像=
在表达式中使用的赋值。
(A){ia}
是一个表达式;它是一种称为复合文字的构造。在括号中的类型名称之后,在大括号内给出初始值。这将创建一个指定类型的对象。然后可以在表达式中使用该对象,例如赋值的右操作数。
推荐阅读
- svelte - 在 svelte 中,如何将异步函数绑定到属性?
- rust - Self 具有匿名生命周期,但它需要满足静态生命周期要求
- beyondcompare - 我可以在 Unison 中使用正则表达式进行“rootalias”对齐吗?
- sql - Prestashop 查询吹SQL
- html - 使用更改的 div id 解析 html
- java - Spring Boot:我们可以在现有的 spring mvc 应用程序中使用响应式 Webfilter 吗?
- mysql - PIVOT/count 列中值的总和 - Mysql
- java - 尽管存在依赖关系,但包不存在
- postgresql - 如何更新 postgres 表并从另一个表迁移数据,在大数据上具有更好的性能 - postgresql
- php - 在 PHP 中使用 Imagick 从 .tif 文件创建图像