这行C做什么?

blo*_*ilk 7 c

我刚刚阅读了一个名为sofia-sip的库,这一行出现在代码示例中:

msg_iovec_t iovec[2] = {{ 0 }};
Run Code Online (Sandbox Code Playgroud)

供参考,这是msg_iovec_t的定义:

struct iovec {
    void *iov_base;     // Pointer to data.
    size_t iov_len;     // Length of data.
};
Run Code Online (Sandbox Code Playgroud)

aaz*_*aaz 8

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

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

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

该行可以等效地编写为

msg_iovec_t iovec[2] = { 0 };
Run Code Online (Sandbox Code Playgroud)

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

效果类似于

msg_iovec_t iovec[2];
bzero(iovec, sizeof iovec);
Run Code Online (Sandbox Code Playgroud)

除了清洁和便携之外,因为填充零字节的指针不一定是空指针.

  • 您在代码中看到双括号的原因是,当GCC作者用于初始化多级聚合(如结构数组)时,通过发出警告设法破坏了对通用零初始化程序成语"{0}"的支持.通常只使用`{0}`,但由于警告,必须使用`{{0}}`. (2认同)