Размер куска malloc кажется неправильным

Я читал, что 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?

Спасибо


person korppu73    schedule 26.10.2018    source источник
comment
Я это читал... - где? Это не гарантируется стандартом совсем. Это полностью зависит от реализации. Лучшая (единственно допустимая) ссылка для понимания деталей вашей реализации, как это, - это сам источник стандартной библиотеки вашей реализации.   -  person WhozCraig    schedule 26.10.2018
comment
Минимальный размещаемый объект на вашей платформе, вероятно, равен 16. Попробуйте использовать различные размеры, и если он работает с кратными 16, тогда вы правы, и я прав.   -  person Antti Haapala    schedule 26.10.2018
comment
Я прочитал это в учебнике (blog.holbertonschool.com/). Таким образом, размер фрагмента, возвращаемого malloc, нельзя предсказать стандартным образом?   -  person korppu73    schedule 26.10.2018
comment
Антти Хаапала: Да, спасибо, я проверил, и это работает, как вы говорите, с числами, кратными 16.   -  person korppu73    schedule 26.10.2018
comment
@korppu73: Он должен возвращать кусок как минимум такого размера, какой вам нужен, но он может быть больше, чтобы соответствовать выравниванию или другим требованиям.   -  person John Bode    schedule 26.10.2018
comment
когда вы используете malloc, вы возвращаете фрагмент минимум запрошенного вами размера, или NULL. Внизу ваш кусок вполне может быть больше, чем вы просили, в зависимости от реализации. Но это не то, на что можно положиться. Это неопределенное поведение для доступа за пределы вашего фрагмента.   -  person yano    schedule 26.10.2018
comment
На странице, на которую вы ссылаетесь, обсуждается конкретная реализация C. На этой странице написано, что это Ubuntu 4.4.0. -31-generic x86_64 с GCC Ubuntu 4.8.4-2ubuntu1~14.04.3, и жирным шрифтом написано: «Все, что мы рассматриваем, будет верно для этой системы/среды, но может отличаться в другой системе». Вы используете ту же систему и программное обеспечение?   -  person Eric Postpischil    schedule 26.10.2018


Ответы (1)


Страница , на которую вы ссылаетесь в комментарий обсуждает конкретную реализацию C. На этой странице написано, что это Ubuntu 4.4.0. -31-generic x86_64 с GCC Ubuntu 4.8.4-2ubuntu1~14.04.3, и жирным шрифтом написано: «Все, что мы рассматриваем, будет верно для этой системы/среды, но может отличаться в другой системе».

Реализации C требуются только для получения результатов, указанных в стандарте C. Базовые механизмы, с помощью которых работает malloc и другие аспекты языка, могут быть реализованы по-разному, и нет оснований ожидать, что используемая вами реализация C ведет себя так же, как другая реализация в отношении внутренней работы malloc.

person Eric Postpischil    schedule 26.10.2018
comment
Хорошо спасибо. Тогда является ли структура метаинформации malloc, предшествующей адресу, возвращаемому malloc, полностью зависимой от реализации? - person korppu73; 27.10.2018
comment
@korppu73: Да. - person Eric Postpischil; 27.10.2018