LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

Какой бы тип базовый тип ты сюда не засунул - никаких днищепаков тут делать не надо. И ты бы это знал, если бы понимал, что выравненный uint64_t всегда оканчивается+1 выравненным по 1/2/4/8 байтам адресу.

http://www.x86-64.org/documentation/abi.pdf страница 13, тип long double

#include <stdio.h>
#include <inttypes.h>

int main(void)
{
  struct {uint64_t len; long double Arr[1];} test = {1,{66.666}};
  printf("%p %p %td\n", &(test.len), test.Arr, (char *)test.Arr-(char *)&(test.len));
  return 0;
}

$ gcc -m32 test.c
$ ./a.out
0xffb4c54c 0xffb4c554 8
$ gcc -m64 test_FFF2.c
$ ./a.out 
0x7fff19577230 0x7fff19577240 16

И в качестве длины вполне может использоваться какой-нибудь uint8_t

Исходная версия SZT, :

Какой бы тип базовый тип ты сюда не засунул - никаких днищепаков тут делать не надо. И ты бы это знал, если бы понимал, что выравненный uint64_t всегда оканчивается+1 выравненным по 1/2/4/8 байтам адресу.

http://www.x86-64.org/documentation/abi.pdf страница 13, тип long double

#include <stdio.h>
#include <inttypes.h>

int main(void)
{
  struct {uint64_t len; long double Arr[1];} test = {1,{66.666}};
  printf("%p %p %td\n", &(test.len), test.Arr, (char *)test.Arr-(char *)&(test.len));
  return 0;
}

$ gcc -m32 test.c
$ ./a.out
0xffb4c54c 0xffb4c554 8
$ gcc -m64 test_FFF2.c
$ ./a.out 
0x7fff19577230 0x7fff19577240 16