初始化时结构内存分配中的指针(c99)
假设我们有一个类型:初始化时结构内存分配中的指针(c99),c,pointers,c99,C,Pointers,C99,假设我们有一个类型: 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”在其自身初始化中使用时未初始化 内存可用,但是否有其他非警告选项可以执行相同操作 在分配a之后,结构才会完全初始化,因为您不知道表达式的求值顺序 如果需要使用
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”在其自身初始化中使用时未初始化
内存可用,但是否有其他非警告选项可以执行相同操作 在分配
a
之后,结构才会完全初始化,因为您不知道表达式的求值顺序
如果需要使用一个结构字段来初始化同一结构中的另一个字段,则必须在单独的步骤中进行初始化。来自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);
这不能用于静态或文件范围对象;在这种情况下,需要一个宏(或者,例如,一个gcc语句表达式,可以在宏中使用)。我认为这个答案是错误的,尤其是这个语句:因为您不知道字段的初始化顺序。C表示初始化应按初始化器列表顺序进行。但正如@ecatmur所指出的,C还表示初始化列表表达式的求值是不确定的,因此这里没有说明。