Calloc со структурой c указателями в C

Я знаю, что calloc запрашивает память для использования, записывает 0 на все биты, а затем возвращает указатель на него.

мой вопрос: если я использую calloc со структурой, содержащей указатели, будут ли эти указатели иметь значение NULL или мне нужно установить их в значение NULL?

struct a{
char * name;
void * p;
}* A;

Итак, в основном, будет ли name и p указывать на NULL после того, как я использовал calloc со структурой a?

спасибо!

4 ответов


Как-то вы получили много неправильных ответов. C не требует, чтобы представление нулевых указателей было all-zero-bits. Многие люди ошибочно думают, что это так, поскольку целочисленное постоянное выражение со значением 0, преобразованное в указатель, становится нулевым указателем.

С учетом сказанного, во всех реальных системах нулевые указатели являются all-zero-bits и calloc - Это вполне разумный способ получить массив указателей с нулевым указателем в реальном мире.


Р.ответ хорош, но я хотел бы добавить стандартные кавычки для поддержки этого и показать способ инициализации 0 вашей структуры, которая на самом деле дает нулевые указатели.

С N1548 (проект C11)

7.22.3.2 функция calloc выделяет пространство для массива объектов nmemb, размер каждого из которых размер. Пространство инициализируется для всех битов ноль.[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 и С99.


да, будут. Аналогично, если вы это сделаете:

static char * a[100];

все указатели в массиве будут иметь значение NULL.


стандарт ISO C для calloc требует, чтобы он инициализировал все до 0. Это означает, что если вы в конечном итоге veiwing память, выделенную calloc в качестве указателей он действительно изначально будет содержать указатели NULL (0).