Что делает эта строка C? - PullRequest
7 голосов
/ 20 марта 2011

Я только что читал о библиотеке под названием sofia-sip , и эта строка появилась в примере кода :

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 ]

8 голосов
/ 20 марта 2011

Это создает массив из двух iovec структур в стеке и инициализирует все члены обоих элементов массива нулем.

Инициализатор {{ 0 }} дает только явное значение дляпервый член первого элемента массива: iovec[0].iov_base.Предоставленное значение 0 неявно преобразуется в нулевой указатель.

Другие члены первого элемента массива и другие элементы массива также неявно инициализируются: указатели на нулевой, а арифметические типы - на 0.

Строка может быть записана эквивалентно как

msg_iovec_t iovec[2] = { 0 };

Это самый короткий стандартный способ инициализации нуля всего объекта, поэтому он идиоматичен.Некоторые компиляторы могут принимать пустой список инициализатора {} в качестве расширения.Некоторые компиляторы могут выдавать предупреждение для этой формы и требовать достаточного количества скобок для обозначения первого неагрегированного элемента (две пары, как в исходной строке).

Эффект аналогичен

msg_iovec_t iovec[2];
bzero(iovec, sizeof iovec);
* 1020.* за исключением чистого и переносимого, поскольку указатель, заполненный нулевыми байтами, не обязательно является нулевым указателем.
2 голосов
/ 20 марта 2011

Первая скобка объявляет, что массив инициализируется.Второе объявляет, что iovec первое поле структуры: iov_base инициализируется значением NULL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...