Приведенный ниже код взят из домашнего задания, посвященного эксплуатации переполнения кучи, которую я понимаю как концепцию. Чего я не понимаю, так это того, что именно происходит с malloc и указателями в этом примере кода. Очевидно, что оба указателя указывают на одно и то же место в куче, но почему? Разве malloc не зарезервирует место для buf1
, а затем зарезервирует еще одно пространство для buf2
?
int main(int argc, const char * argv[])
{
int diff, size = 8;
char *buf1, *buf2;
buf1 = (char * )malloc(size);
buf2 = (char *)malloc(size);
diff = buf2-buf1;
memset(buf2, '2', size);
printf("BEFORE: buf2 = %s",buf2);
memset(buf1, '1', diff +3);
printf("AFTER: buf2 = %s", buf2);
return 0;
}
Этот код производит вывод
BEFORE: buf2 = 22222222AFTER: buf2 = 11122222
Большое спасибо. :)
printf
. 2. Вы предполагаете, что существует некоторая надежная связь между адресами двух указателей. 3. Не приводить возвращаемое значениеmalloc
. - person Ed S.   schedule 28.04.2014malloc()
выделяет для вас 8 байтов, а второй вызовmalloc()
выделяет следующие 8 байтов. Когда вы перезаписываете границы первого распределения, вы просто прошиваете и начинаете запись во второе распределение. Не гарантируется, что вы всегда будете получать непрерывные выделения, подобные этому, но если вы выделяете размеры блоков, которые кратны требованиям выравнивания, вы, вероятно, можете ожидать, что разумный распределитель памяти сделает это. - person Crowman   schedule 28.04.2014buf1
иbuf2
указывают на два разных объекта. Вычитание двух указателей имеет неопределенное поведение. - person Keith Thompson   schedule 28.04.2014