Указатель, возвращаемый функцией malloc (), указывает непосредственно на память в куче, которая будет использоваться вашей программой.
Однако это не единственная выделенная память. Несколько байтов выделяются в ячейках памяти, непосредственно предшествующих возвращенному указателю, которые указывают размер куска в куче. Это не используется вашей программой, но обязательно понадобится бесплатно.
Когда вызывается free (p), информация о его порции в куче содержится, скажем, в местах от p-4 до p-1. Конечно, это зависит от реализации, но детали не должны касаться программиста. Единственное, что нужно знать программисту, это то, что free использует эту область памяти , чтобы освободить часть памяти из кучи, и эта область получается из исходного указателя p.
Другими словами, если вы вызываете free на p, это будет иметь смысл только в том случае, если malloc однажды вернул точно p.
Если вы передадите указатель, который не был создан с помощью malloc, кто знает, что будет лежать в p-1, p-2 и т. Д.? Это, вероятно, приведет к катастрофической неудаче.