как «свободно» работает при увеличении указателя

21
задан 11 March 2010 в 15:36
поделиться

9 ответов

Вам нужно free() тот же указатель, который вы получили от malloc(). Увеличение, изменение или изменение этого указателя - это неопределенное поведение, которое обычно является ошибкой сегментации.

Думайте о полученном указателе как о книге из библиотеки. Вы приходите домой и читаете ее. После этого вы отрываете первую страницу и корешок книги и отдаете ее обратно библиотекарю. Примет ли он ее или у вас теперь серьезные проблемы? ;-)

28
ответ дан 29 November 2019 в 06:38
поделиться

Это вызовет неопределенное поведение. Скорее всего, это приведет к сбою вашей программы либо сразу, либо позже.

6
ответ дан 29 November 2019 в 06:38
поделиться

Это неопределенное поведение. И это, скорее всего, приведет к проблемам позже.

4
ответ дан 29 November 2019 в 06:38
поделиться

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

Это называется неопределенным поведением и это подлость. Он может отформатировать ваш жесткий диск, поднять ваш процессор или заставить вашу программу работать так, как ожидалось, пока вы не выйдете на пенсию. Никогда не знаешь.

3
ответ дан 29 November 2019 в 06:38
поделиться

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

Однако это не единственная выделенная память. Несколько байтов выделяются в ячейках памяти, непосредственно предшествующих возвращаемому указателю, которые указывают размер фрагмента в куче. Это не используется вашей программой, но обязательно понадобится бесплатно.

Когда вызывается free (p), информация о его блоке в куче содержится, скажем, в местах от p-4 до p-1. Конечно, это зависит от реализации, но детали не должны беспокоить программиста. Единственное, что нужно знать программисту, это то, что free использует эту область памяти для освобождения фрагмента памяти из кучи, и эта область является производной от исходного указателя p.

Другими словами, если вы вызываете free для p, это будет иметь смысл только в том случае, если malloc однажды вернул ровно p.

Если вы передадите указатель, созданный не с помощью malloc, кто знает, что будет в p-1, p-2 и т. Д.? Вероятно, это приведет к катастрофическому отказу.

-1
ответ дан 29 November 2019 в 06:38
поделиться

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

4
ответ дан 29 November 2019 в 06:38
поделиться

Это то, что мы называем утечкой памяти / segmentation fault.

Вы ДОЛЖНЫ передать в free () то же значение указателя, которое вы получили от malloc (), иначе ваше приложение будет вести себя неправильно / аварийно завершится.

2
ответ дан 29 November 2019 в 06:38
поделиться

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

3
ответ дан 29 November 2019 в 06:38
поделиться

Вы можете вызвать free () только для значения, которое вы ранее получили из malloc () , calloc () или realloc ( ) (или NULL ). Все остальное не определено.

Например, реализация может хранить размер выделенного блока в 4 байта перед адресом возврата из malloc () . Затем free () возвращается на 4 байта назад и определяет размер. Это не сработает, если вы не передадите исходный указатель обратно в free () .

11
ответ дан 29 November 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: