Вопрос по c – Могу ли я освободить () статические и автоматические переменные в C?

8

Код выглядит следующим образом:

#include <stdlib.h>

int num = 3;   // Static external variable
int *ptr = &num;

int main(void)
{
 int num2 = 4;  // Automatic variable
 int *ptr2 = &num2;

 free(ptr);  //Free static variable
 free(ptr2); //Free automatic variable

 return 0; 
}

Я пытаюсь скомпилировать приведенный выше код, и он работает, мне интересно,free() функция, способная освободить как статическую переменную, так и автоматическую переменную? Или в принципе это ничего не делает?

Это "работает" для достаточно низкого качества определения «произведений». Также может произойти сбой даже в одной системе, в одном и том же компиляторе или при разных параметрах компиляции. Это простоundefined behaviour - может случиться все, даже что-то ожидаемое. Jens

Ваш Ответ

2   ответа
16

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

Просто избегайте написания кода, который вызывает неопределенное поведение - единственное решение.

Error: User Rate Limit Exceeded caramel1995
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededsameError: User Rate Limit Exceeded
5

free используется только для памяти, динамически выделяемой из кучиmalloc семейство функций.

Память дляnum статически размещен в сегменте данных и не может быть освобожден. Память дляnum2 выделяется вmainфрейм стека вызовов и будет освобожден, как толькоmain возвращается.

Что на самом деле происходит, зависит от реализацииfree, Обычно в куче поддерживаются конкретные структуры данных, чтобы помочьmalloc/free отслеживать выделенные и свободные области памяти.free ожидает, что эти структуры данных будут где-то рядом с местом, на которое указывает их аргумент. Когда вы передаете ему указатель, который не указывает наmallocВыделенная область кучи, она будет рассматривать данные об мусоре как некоторую полезную информацию и делать некоторые странные вещи. И вам повезло, если в результате произошел немедленный сбой программы.

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