Há alguma garantia sobre a ordem C struct?

Eu usei structs extensivamente e eu vi algumas coisas interessantes, especialmente*value ao invés devalue->first_value onde value é um ponteiro para struct,first_value é o primeiro membro, é*value seguro?

Observe também que os tamanhos não são garantidos por causa do alinhamento, qual é o valor de alginment baseado no tamanho da arquitetura / registro?

Alinhamos dados / código para execução mais rápida podemos dizer ao compilador para não fazer isso? então talvez possamos garantir certas coisas sobre estruturas, como seu tamanho?

Ao fazer aritmética de ponteiros em membros de struct para localizar o offset do membro, eu aceito que você faz- se little endian+ para big endian, ou depende apenas do compilador?

O que o malloc (0) realmente aloca?

O código a seguir é para fins educacionais / de descoberta, não é para ser de qualidade de produção.

#include <stdlib.h>
#include <stdio.h>

int main()
{
    printf("sizeof(struct {}) == %lu;\n", sizeof(struct {}));
    printf("sizeof(struct {int a}) == %lu;\n", sizeof(struct {int a;}));
    printf("sizeof(struct {int a; double b;}) == %lu;\n", sizeof(struct {int a; double b;}));
    printf("sizeof(struct {char c; double a; double b;}) == %lu;\n", sizeof(struct {char c; double a; double b;}));

    printf("malloc(0)) returns %p\n", malloc(0));
    printf("malloc(sizeof(struct {})) returns %p\n", malloc(sizeof(struct {})));

    struct {int a; double b;} *test = malloc(sizeof(struct {int a; double b;}));
    test->a = 10;
    test->b = 12.2;
    printf("test->a == %i, *test == %i \n", test->a, *(int *)test);
    printf("test->b == %f, offset of b is %i, *(test - offset_of_b) == %f\n",
        test->b, (int)((void *)test - (void *)&test->b),
        *(double *)((void *)test - ((void *)test - (void *)&test->b))); // find the offset of b, add it to the base,$

    free(test);
    return 0;
}

chamandogcc test.c Seguido por./a.out Eu entendi isso:

sizeof(struct {}) == 0;
sizeof(struct {int a}) == 4;
sizeof(struct {int a; double b;}) == 16;
sizeof(struct {char c; double a; double b;}) == 24;
malloc(0)) returns 0x100100080
malloc(sizeof(struct {})) returns 0x100100090
test->a == 10, *test == 10 
test->b == 12.200000, offset of b is -8, *(test - offset_of_b) == 12.200000

Atualizar esta é minha máquina:

gcc --version

i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

uname -a

Darwin MacBookPro 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

questionAnswers(5)

yourAnswerToTheQuestion