假设我们有一个类型:
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)};
编译器显示警告
变量“数据”在其自己的初始化中使用时未初始化
内存可用且全部可用,但还有其他一些非警告选项可以做同样的事情吗?
从 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 语句表达式)。
直到分配之后,该结构才完全初始化a
,因为您不知道表达式的计算顺序。
如果您需要使用结构字段来初始化同一结构中的另一个字段,则必须分步进行。