Повреждение кучи в C - PullRequest
       5

Повреждение кучи в C

3 голосов
/ 13 октября 2010
int main ()
{
    int * b;
    b = (int*) malloc (1);
    *b=110000;
    free (b);
    return 0;
}

Почему повреждение кучи происходит в free (b);?

ИМО, повреждение кучи уже происходит на *b=110000;.

Ответы [ 4 ]

14 голосов
/ 13 октября 2010
Аргумент

malloc() - это количество байтов для выделения. Вам необходимо использовать:

b = (int*) malloc(sizeof(int));

Вы выделили слишком маленький блок, а затем записали в него больше байтов, чем выделили, что перезаписывает бухгалтерскую информацию рядом с блоком, повреждая кучу.

5 голосов
/ 13 октября 2010

Это на * b = 110000;Потому что вы выделяете память для одного байта, а затем присваиваете ей целое число, которое составляет более одного байта.Либо у вас может быть b = (int *) malloc (sizeof (int)), либо вместо int * b вы можете использовать char * b, а затем приводить неверный указатель к char *.Код даже может работать, если вы назначите значение, которое меньше 128 (из-за знака со знаком) для * b.

РЕДАКТИРОВАТЬ: - Я думаю, иногда даже это будет работать без каких-либо хлопот.Потому что компилятор может выбрать более одного байта памяти для быстрого доступа к данным.

4 голосов
/ 13 октября 2010

Повреждение кучи действительно происходит уже при присваивании *b=11000, но оно не обнаруживается до вызова free(b), потому что это первая точка, где целостность кучи проверяется снова.

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

0 голосов
/ 13 октября 2010

Код записывает больше данных в блок памяти, чем доступное ему пространство, поэтому портит начало следующего действительного блока памяти.

Использование char * вместо int * и запись значения от -128 до 127 в * b должны исправить это.

...