Initializing a void* buffer with calloc [duplicate]

Refresh

November 2018

Views

38 time

2

This question already has an answer here:

So I've read the documentation for calloc and it says that it will initialize n objects of size size and initialize each of them to 0.

So before making my implementation of a generic dynamic array in C I decided to make it with int type to make things simpler. I used to call calloc and every integer in the buffer would be initialized as 0 meaning an empty space. But when I changed the data buffer from int *buffer to void **buffer I've been wondering if this properly initializes every void pointer to NULL. I've seen NULL being cast to 0 if you do int a = NULL but does void *p = 0 the same as void *p = NULL? And is this what calloc actually does?

2 answers

4

NULL будет гарантировано не указывает ни на что. Все callocделает нулевой заполнения памяти после malloc.

«Пустой указатель концептуально отличается от неинициализированного указателя нулевой указатель, как известно, не указывает на какой-либо объект или функцию,. Неинициализированная указатель может указывать в любом месте Смотрите также расспрашивает 1,30, 7,1 и 7,31..»

«Как уже упоминалось выше, существует нулевой указатель для каждого типа указателя, и внутренние значения нулевых указателей для разных типов могут быть разными. Хотя программисты не нужно знать внутренние значения, компилятор всегда должен быть проинформирован, какой тип нулевого указателя требуется, чтобы он мог сделать различие, если это необходимо (см вопросы 5.2, 5.5 и 5.6) «.

http://c-faq.com/null/null1.html

1

Во-первых, обратите внимание: Стандарт фактически не указать, что указатель NULL является побитовое равен нулю, так что NULL не указывает ни на что. В большинстве реализаций, однако, NULL является побитовое равным 0.

void *p = 0будет установлен р указателю , состоящей только на 0 - х. В то время как на вашей машине это может быть такой же , как void *p = NULL, это не гарантируется стандартом C.

void **buffer = calloc(...)установит каждый void *pв bufferк 0, который может соответствует NULLна вашей машине.

давайте рассмотрим calloc(3, 4), на машине , где целые числа и недействительные указатели являются 4 байта. (Обратите внимание , что целые числа и недействительные указатели не всегда 4 байта, это только для демонстрационных целей.) callocБудет в этом случае выделяют:

| 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |

и возвращает указатель на память выше (номера представляют собой значение, хранящееся в памяти в шестнадцатеричном формате).

если мы делаем int *buffer = calloc(3, 4), каждый 4 байта bufferбудет целое число со значением 0.

если мы делаем void **buffer = calloc(3, 4), каждый 4 байта bufferвместо этого будет void*ссылающийся на адрес 0. На машинах , где NULL является побитовое 0, это будет такой же , как заполнение bufferс NULL указатели.