malloc
требуется для возврата указателей, которые достаточно выровнены для хранения данных любого типа, даже типов данных, которые не могут поместиться в выделенном пространстве. Это означает, что если _Alignof(max_align_t) == 32
в вашей системе, malloc(1)
должен возвращать только указатели, кратные 32, даже если вы запрашиваете меньше места, чем это. Для реализации простой способ сделать это состоит в том, чтобы округлить каждое распределение до значения, кратного 32, в своих внутренних бухгалтерских данных, что, по-видимому, является тем, на что вы смотрите.
Однако C Стандарт специально запрещает вам доступ к памяти даже на один байт за пределами требуемого объема пространства. Он также специально запрещает вам доступ к внутренним бухгалтерским данным malloc
. Если вы запустите свою программу под валидатором доступа к памяти, таким как valgrind
или ASan, она вызовет sh.