//-std=c99 -Wall -Wextra -Wpedantic -Wshadow //gcc 64bit #include #include #include int main() { typedef float vec2[2]; typedef float vec3[3]; typedef float vec4[4]; struct st{ char a; int b; float c; double d; vec2 v2; vec3 v3; vec4 v4; }; struct st s; struct st *ps; printf ("sizeof struct st: %zu\n", sizeof (struct st) ); printf ("sizeof s: %zu\n", sizeof s ); printf ("sizeof &s: %zu\n", sizeof &s ); printf ("sizeof ps: %zu\n", sizeof ps ); printf ("sizeof *ps: %zu\n", sizeof *ps ); ps = malloc ( sizeof(struct st) ); if ( !ps ) { printf("memory allocation error.\n"); return 1; } ps->a = 1; printf("(1) %d\n", ps->a); (*ps).a = 2; printf("(2) %d\n", ps->a); printf ("address of s: %p\n", (void*) &s ); printf ("address of ps: %p\n", (void*) ps ); printf( "offsetof b: %ld\n", offsetof( struct st, b) ); printf( "offsetof v3: %ld\n", offsetof( struct st, v3) ); printf( "offsetof v4: %ld\n", offsetof( struct st, v4) ); printf ("between v3 and v4: %ld\n", offsetof( struct st, v4) - offsetof( struct st, v3) ); printf ("sizeof ps->a: %zu\n", sizeof ps->a ); printf ("address of ps->a: %p\n", (void*) &ps->a ); printf ("address of ps->b: %p\n", (void*) &ps->b ); long offset = (char*) &ps->b - (char*) ps; printf ("offset of ps->b: %ld\n", offset ); offset = (char*) &ps->v4 - (char*) &ps->v3; printf ("between v3 and v4: %ld\n", offset ); free(ps); return 0; } /* output: sizeof struct st: 64 sizeof s: 64 sizeof &s: 8 sizeof ps: 8 sizeof *ps: 64 (1) 1 (2) 2 address of s: 0x7ffdbef19500 address of ps: 0x558174b85670 offsetof b: 4 offsetof v3: 32 offsetof v4: 44 between v3 and v4: 12 sizeof ps->a: 1 address of ps->a: 0x558174b85670 address of ps->b: 0x558174b85674 offset of ps->b: 4 // 4 because of alignment, https://pastebin.com/kEdeRr5b between v3 and v4: 12 */