Ответ R. хорош, но я хотел бы добавить стандартные кавычки, чтобы поддержать это, и показать способ значение 0 инициализирует вашу структуру, которая на самом деле дает указатели NULL.
Из N1548 (проект C11)
7.22.3.2 Функция calloc выделяет место для массива объектов nmemb, размер каждого из которых равен size. Пространство инициализируется нулевыми битами.[289]
Затем в сноске говорится (курсив добавлен):
Обратите внимание, что это не обязательно должно совпадать с представлением нуля с плавающей запятой или константой нулевого указателя.
Хотя нулевой указатель обычно представляется как все 0 бит, такое представление не гарантируется. Чтобы ответить на ваш вопрос напрямую, нет вы не можете полагаться на то, что указатели структуры calloc()
d будут NULL
.
Если вы хотите установить для всех содержащихся указателей динамически выделяемой структуры значение NULL
, вы можете использовать следующее:
struct a *s = malloc(sizeof *s);
*s = (struct a){0};
C11:
6.7.9.21 Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или членов агрегата, [...] оставшаяся часть агрегата должна быть инициализирована неявно так же, как объекты, которые имеют статическую продолжительность хранения
а также
6.7.9.10 ... Если объект со статической или потоковой длительностью хранения не инициализируется явно, то:
— если он имеет тип указателя, он инициализируется нулевым указателем;< бр>
C требует, чтобы у вас был хотя бы один элемент внутри фигурных скобок, поэтому я использую {0}
вместо {}
. Остальные элементы инициализируются в соответствии с указанными выше правилами, что приводит к нулевым указателям. Насколько я могу судить, правила для этого одинаковы в C11 и C99.
person
Ryan Haining
schedule
08.08.2014