这行C做什么?

时间:2011-03-20 11:35:11

标签: c

我刚刚读到一个名为sofia-sip的图书馆,这一行出现在code sample中:

msg_iovec_t iovec[2] = {{ 0 }};

供参考,以下是msg_iovec_t的定义:

struct iovec {
    void *iov_base;     // Pointer to data.
    size_t iov_len;     // Length of data.
};

2 个答案:

答案 0 :(得分:8)

这会在堆栈上创建一个包含两个iovec结构的数组,并将两个数组元素的所有成员初始化为零。

初始值设定项{{ 0 }}仅为第一个数组元素的第一个成员提供显式值:iovec[0].iov_base。提供的值0被隐式转换为空指针。

第一个数组元素的其他成员和其他数组元素也被隐式初始化:指向null的指针和0的算术类型。

该行可以等效地写为

msg_iovec_t iovec[2] = { 0 };

这是对整个对象进行零初始化的最短标准方法,因此它是惯用的。某些编译器可能会接受空的初始化列表{}作为扩展名。某些编译器可能会对此表单发出警告,并且需要足够的大括号来指定第一个非聚合成员(原始行中的两对)。

效果类似于

msg_iovec_t iovec[2];
bzero(iovec, sizeof iovec);

除了清洁和可移植之外,因为填充零字节的指针不一定是空指针。

答案 1 :(得分:2)

第一个括号声明正在初始化数组。第二个声明结构的iovec第一个字段:iov_base正由NULL值初始化