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

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

#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() функция, способная освободить как статическую переменную, так и автоматическую переменную? Или в принципе это ничего не делает?

Ответы на вопрос(2)

Решение Вопроса

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

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

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

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

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

Ваш ответ на вопрос