Как free() знает, сколько памяти освобождает?

Возможный дубликат:
C-программирование: как бесплатно узнать, сколько бесплатно?

При программировании на C я часто использую malloc() для выделения памяти и free() для ее выпуска:

MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects);
/** Do stuff **/
free(objArr);

Как free() знает, сколько памяти освобождается? Создает ли malloc() таблицу где-то, чтобы запомнить указатели и сколько памяти указала указатель на указатель?

Если это так, будет free() сбой, если я переименую указатель? например:.

MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects);
MyObject* newPtr= objArr;
free(newPtr); /** Does this fail? **/

Что произойдет, если я увеличиваю указатель и запустим free()? например:.

MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects);
newPtr++;
free(newPtr); /** What happens now? **/

Будет ли он освобождать дополнительный кусок памяти сразу после конца исходного массива?

Ответ 1

Наиболее распространенным способом является то, что он хранит некоторую информацию непосредственно перед адресом, который он возвращает вам. Поэтому, если malloc возвращает адрес 0x1004, внутренне malloc отложит память, начатую с 0x0FFC, и сохранит различную информацию, такую ​​как размер где-то в памяти между 0xFFC - 0x1003, но приложению будет сказано, что распределение начинается с 0x1004.

Единственное, что имеет значение для свободного, - это получить тот же адрес, что и возвращаемый malloc.