初始化中结构内存分配中的指针(c99)

时间:2013-02-01 20:53:45

标签: 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'时未初始化

内存可用,但是还有其他一些非警告选项吗?

2 个答案:

答案 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>

如果您需要使用结构字段初始化同一结构中的另一个字段,则必须分别执行此操作。