Почему мой висячий указатель не вызывает ошибку сегментации?

Мой код:

#include  #include  int main(void) { int *p = (int *)malloc(sizeof(int)); free(p); *p = 42; return 0; } 

Я создал указатель, затем указал на выделенное пространство, и, наконец, я назначил ему 42. По-моему, это не должно работать, это должно вызвать ошибку сегментации, но она работает. Итак, почему?

PS: Я обычно скомпилировал его с помощью Gcc на Linux

Чистое везение. Поведение в этом случае не определено . Т.е.: нет никаких ожиданий относительно того, что может произойти.

По-моему, это не должно работать […], но оно работает.

Не волнуйтесь, это не сработает.

это должно вызвать ошибку сегментации

Скажите это комитету по стандарту C. Это просто неопределенное поведение, оно не требуется для сбоя.

Более сложный ответ, помимо «неопределенного», заключается в том, что вы можете писать в произвольные ячейки памяти на C, пока вы остаетесь в пределах выделенных процессов. В зависимости от ОС может быть разрешен код перезаписи. Болезненные эффекты появляются только после того, как какой-то другой код вашего процесса запутался в том, что обнаружено в искаженной памяти. Так как ваша программа сразу же выйдет из памяти, то вероятность того, что некоторые из ее кода запутаются, явно мала.

Поведение в этом случае не определено,

это возможность с поведением undefin

вы указываете адрес памяти p до и после бесплатной проверки «p» с помощью:

 #include  #include  int main(void) { int *p = (int *)malloc(sizeof(int)); printf("before \n %p \n",p); free(p); *p = 42; printf("after\n %p \n",p); printf(" %d \n",*p); return 0; } 

до и после свободного мы имеем одну и ту же адресную память, потому что free () не присваиваем NULL p-указателю, поэтому *p = 42; работать как статическое задание, хотя это неопределенное поведение.

предложите использовать БЕСПЛАТНЫЙ макрос:

 #define FREE(X) \ free(X);\ X=NULL; 

проверьте этот макрос, и вы увидите ожидаемое поведение