4

假设我们有一个类型:

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)};

编译器显示警告

变量“数据”在其自己的初始化中使用时未初始化

内存可用且全部可用,但还有其他一些非警告选项可以做同样的事情吗?

4

2 回答 2

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);

这不能用于静态或文件范围的对象;在这种情况下,需要一个宏(或者,例如,可以在宏中使用的 gcc 语句表达式)。

于 2013-02-01T21:16:41.113 回答
3

直到分配之后,该结构才完全初始化a,因为您不知道表达式的计算顺序。

如果您需要使用结构字段来初始化同一结构中的另一个字段,则必须分步进行。

于 2013-02-01T20:56:12.657 回答