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).