ret = buffer1 + 12 + 4 + 1;
Это Undefined Behavior ™ , поскольку арифметика указателей вышла из выделения.Теперь компилятор может делать все, что пожелает, вплоть до того, что демоны вылетят из носа.
(* ret) + = 4;
Иgcc получил очень хорошо , обнаружив неопределенное поведение, и довольно неплох, когда приходит время выбирать, что ему нравится.
Если оптимизации включены, он может просто полностью игнорировать оператор, если нетв любом случае, вы, вероятно, неправильно смещены, потому что нет абсолютно никакой гарантии относительно расположения переменных.Будет несколько отступов для выравнивания, и даже порядок может быть другим.И я не уверен, откуда вы взяли +1
, но нет разумного макета, в котором это имело бы смысл.
Вы также, похоже, предполагаете 32-битную цель, но большинство Linux полностью 64-битныев эти дни.