Почему & quot; char ptr [n]; свободный (PTR); & Quot; вызывает сбой программы?

Используя c:

  char ptr[n];
free(ptr);

На мой взгляд: когда «char ptr [n];» используется, память выделяется, и ptr указывает на нее, free (ptr) должен работать.
И программа не удалась, почему? (N == 5, например)
Любой глубокий анализ?

-2

Решение

Потому что ты звонил free для переменной, не выделенной с malloc,
Это вызывает Неопределенное поведение. К счастью для вас, он падает, и вы можете обнаружить его, иначе он может потерпеть крах в самые неловкие времена.

Ты звонишь free для освобождения памяти переменных, выделенных в куче, у вас есть массив в локальном хранилище (при условии, что он находится в функции), и он автоматически освобождает, когда область ({,}) в котором он был создан заканчивается.

6

Другие решения

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

Автоматические массивы не обязательно должны быть свободными () ‘d. Они освобождаются, когда их область действия заканчивается.

2

Только free объект, который был выделен malloc, Освобождение объекта, который не был выделен malloc является неопределенным поведением.

1

Из-за `char ptr [n]; ‘ прочь объявить массив в СТЕК память, и он имеет область действия блока, что означает, что он уничтожается из памяти, когда блок заканчивается.

но когда вы используете malloc(size) указатель будет указывать на кусок памяти в КУЧА память, и он берет объем, который дает программист. Я имею в виду, что когда вы хотите уничтожить его, вы должны использовать free(ptr) или ОС освободит его после завершения программы.

Итак, когда вы используете free по указателю, который указывает на кусок памяти в СТЕК памяти это вызывает неопределенное поведение и сбой программы, потому что free работает только на КУЧА объем памяти.

0

Это выглядит похоже может ли звонок на свободный в с когда-либо потерпеть неудачу (SO)
Поведение не определено в соответствии со стандартом. В некоторых случаях ваш код не может произойти сбой так скоро. Это может привести к повреждению кучи и сбоям очень поздно во время выполнения и затруднить отладку.
В некотором смысле это зависит от дизайна методов malloc / free.

Один из способов, который я знаю:
с каждым malloc к блоку присоединяется дополнительный блок памяти, который возвращается функцией malloc (). Этот блок содержит некоторые служебные данные, которые необходимы при вызове free (). В вашем случае эти данные отсутствуют, так как память не была выделена функцией malloc (). Так свободно()
пытается использовать данные, предшествующие вашему массиву, не зная, что это мусор.

0
По вопросам рекламы [email protected]