Ответ
R. хороший, но я бы хотел добавить стандартные кавычки для поддержки этого и показать способ инициализации структуры 0, который фактически дает указатели NULL.
С N1548 (черновик C11)
7.22.3.2 Функция calloc выделяет пространство для массива объектов nmemb, каждый изчей размер есть размер.Пробел инициализируется всеми битами, равными нулю. [289]
Сноска затем говорит (выделение добавлено):
Обратите внимание, что это не обязательно должно быть одинаковымкак представление нуля с плавающей точкой или константа нулевого указателя.
Хотя нулевой указатель обычно представляется как все 0 битов, это представление не гарантируется.Чтобы ответить на ваш вопрос напрямую, no вы не можете полагаться на указатели calloc()
'struct, которые будут 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.