¿Hay alguna garantía sobre el orden de la estructura?

He usado estructuras ampliamente y he visto algunas cosas interesantes, especialmente*value en lugar devalue->first_value donde el valor es un puntero a la estructura,first_value es el primer miembro, es*value ¿seguro?

También tenga en cuenta que los tamaños no están garantizados debido a la alineación, ¿en qué se basa el valor de alginment, el tamaño de la arquitectura / registro?

Alineamos datos / código para una ejecución más rápida. ¿Podemos decirle al compilador que no haga esto? ¿Entonces tal vez podamos garantizar ciertas cosas acerca de las estructuras, como su tamaño?

Al hacer aritmética de punteros en miembros de estructura para ubicar la compensación de miembros, supongo que lo hace- si poco endian+ para Big Endian, o solo depende del compilador?

¿Qué asigna realmente malloc (0)?

El siguiente código es para fines educativos / de descubrimiento, no pretende ser de calidad de producción.

#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;
}

vocacióngcc test.c seguido por./a.out Entiendo esto:

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

Actualizar esta es mi maquina

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

Respuestas a la pregunta(5)

Su respuesta a la pregunta