【问题标题】:Pointer in structure memory allocation in initialization (c99)初始化时结构内存分配中的指针(c99)
【发布时间】:2013-02-01 20:53:44
【问题描述】:

假设我们有一个类型:

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

编译器显示警告

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

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

【问题讨论】:

    标签: c pointers c99


    【解决方案1】:

    从 6.7.9p23:

    初始化列表表达式的求值顺序不确定 [...] (152) 特别是,评估顺序不必与子对象初始化的顺序相同。

    因此不能保证 a.sizecalloc(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 语句表达式)。

    【讨论】:

      【解决方案2】:

      结构直到a 赋值之后才完全初始化,因为您不知道表达式将按哪个顺序进行计算。

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

      【讨论】:

      • 我认为这个答案是错误的,尤其是以下陈述:因为您不知道字段的初始化顺序。 C 表示初始化应按初始化列表顺序进行。但是正如@ecatmur 指出的那样,C 也表示 初始化列表表达式的计算相对于彼此的顺序是不确定的,所以这就是这里未指定的原因。
      猜你喜欢
      • 1970-01-01
      • 2021-04-12
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多