Я читал, что 0x10 байтов, предшествующих адресу, возвращаемому malloc, содержат размер куска памяти, запрашиваемого malloc + 0x10 + 1. Однако в следующем фрагменте кода, где я запрашиваю 8 байтов у malloc, размер malloc + 0x10 + 1, должно быть 8+16+1=25:
int main( ){
void *p=malloc(8);
Если затем я проверю память 0x10 байтов, предшествующих адресу, возвращаемому malloc:
(gdb) p/x p
$3 = 0x555555756260
(gdb) x/16xb 0x555555756260 - 0x10
0x555555756250: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x555555756258: 0x21 0x00 0x00 0x00 0x00 0x00 0x00 0x00
появляется размер 0x21 (33). Почему 33, а не 25?
Спасибо
malloc
, вы возвращаете фрагмент минимум запрошенного вами размера, илиNULL
. Внизу ваш кусок вполне может быть больше, чем вы просили, в зависимости от реализации. Но это не то, на что можно положиться. Это неопределенное поведение для доступа за пределы вашего фрагмента. - person yano   schedule 26.10.2018