free () использует данные, добавленные к выделенному блоку, для управления кучей.Если указанная память не была выделена функцией выделения кучи, такой как malloc () или calloc (), то данные, предшествующие блоку, будут бессмысленными в качестве данных управления кучей.
Некоторые библиотеки обнаруживают недопустимые данные кучи и выдают ошибку времени выполнения, в противном случае поведение не определено.Часто последствия такой ошибки остаются незамеченными до тех пор, пока вы не попытаетесь выделить дополнительную память.Это может сделать отладку таких ошибок очень сложной.
Вы не получите ошибку компилятора, поскольку она не является синтаксической ошибкой и не обнаруживается во время компиляции.Компилятор не знает семантики библиотечных функций.Все, что он знает, это то, что malloc () возвращает void *, а free () принимает void *;во время компиляции невозможно узнать, ссылается ли указатель на динамически распределенный блок, поскольку память по определению выделяется во время выполнения.Также указатель может быть изменен во время выполнения, чтобы указывать на любой тип памяти, или может быть псевдонимом - скопирован в другой указатель и затем свободен через второй указатель.Вы ожидаете много компилятора, если вы ожидаете сообщение об ошибке;однако некоторые инструменты статического анализа могут предупреждать о возникновении такой ошибки, а инструменты динамического анализа, такие как valgrind, могут обнаруживать ошибку, когда и если она действительно возникает во время тестирования.