Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初始化时结构内存分配中的指针(c99)_C_Pointers_C99 - Fatal编程技术网

初始化时结构内存分配中的指针(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还表示初始化列表表达式的求值是不确定的,因此这里没有说明。