Откуда mallo c () знает, что вы хотите использовать блок памяти, который он поставляет как массив? - PullRequest
1 голос
/ 16 февраля 2020

Если malloc() возвращает указатель на один блок памяти, как его можно использовать для последовательного хранения нескольких значений и предоставления доступа к каждому из них с помощью оператора индекса, действующего как указатель на массив?

Если бы я попытался изменить «второй элемент» целого числа, подписав его адрес, это вызвало бы неопределенное поведение. Поскольку malloc() возвращает указатель на один блок памяти, не должен ли указатель, который он возвращает, относиться ко всему блоку, и, следовательно, при его подписке он должен получить доступ к значению мусора рядом с ним в памяти?

Кроме того, выделенная память также может использоваться для хранения одного значения, но только до размера типа, к которому приведен указатель, а не до размера выделенного блока памяти.

Это все что-то делать с типом, к которому приведен указатель после возврата? Может ли кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2020

Я думаю, что ваше недоразумение здесь:

Поскольку mallo c () возвращает указатель на один блок памяти, разве указатель, который он возвращает, ссылается на весь блок, и таким образом, подписав его, он должен получить доступ к значению мусора рядом с ним в памяти?

Действительно, если вы сделаете p = malloc(n) и p будет иметь тип "указатель на некоторый тип размера n", тогда p[1] - доступ за пределы массива. Однако обычно, когда вы делаете p = malloc(n) для выделения массива, тип p является не указателем на массив (размером n), а указателем на первый элемент массив. То есть вместо

char (*p)[500] = malloc(500);

вы делаете:

char *p = malloc(500);

и в этом случае p[1] совершенно корректно. Обратите внимание, что с первой, необычной формой вы все равно можете сделать (*p)[1] или p[0][1] и сделать ее действительной.

0 голосов
/ 16 февраля 2020

Но будьте осторожны, если вы используете mallo c несколько раз, он вернет память, выделенную в разных частях кучи. Таким образом, вы не можете перемещаться из одного массива в другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...