让我们假设我们有一个类型:
typedef struct __BUFF_T__
{
u_int8_t *buf;
u_int32_t size;
}buff_t;
在c99下一次分配内存是否正确?
buff_t a = {.size = 20,.buf = calloc(a.size,1)};
编译器显示警告
在自己的初始化
中使用变量'data'时未初始化
内存可用,但是还有其他一些非警告选项吗?
答案 0 :(得分:4)
从6.7.9p23开始:
初始化列表表达式的评估是用不确定的顺序排序的 相互尊重[...](152)特别是,评估顺序不必与子对象初始化的顺序相同。
因此,无法保证a.size
初始化calloc(a.size, 1)
时,a.buf
的初始化评估inline buff_t create_buff(u_int32_t size) {
return (buff_t) {.size = size, .buf = calloc(size, 1)};
}
buff_t a = create_buff(20);
。
在这种情况下,合适的初始化程序将是一个创建函数:
{{1}}
这不能用于静态或文件范围对象;在这种情况下,宏是必要的(或者,例如,gcc语句表达式,可以在宏中使用)。
答案 1 :(得分:3)
在分配 如果您需要使用结构字段初始化同一结构中的另一个字段,则必须分别执行此操作。a
之后结构未完全初始化,因为您不知道将在哪个 order 中评估表达式。< / p>