История изменений
Исправление 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