1 2 typedef __SIZE_TYPE__ Size_t; 3 4 #if __SIZEOF_LONG__ < __SIZEOF_POINTER__ 5 #define bufsize ((1LL << (8 * sizeof(Size_t) - 2))-256) 6 #else 7 #define bufsize ((1L << (8 * sizeof(Size_t) - 2))-256) 8 #endif 9 10 struct huge_struct 11 { 12 short buf[bufsize]; 13 int a; 14 int b; 15 int c; 16 int d; 17 }; 18 19 union huge_union 20 { 21 int a; 22 char buf[bufsize]; 23 }; 24 union_size()25Size_t union_size() 26 { 27 return sizeof(union huge_union); 28 } 29 struct_size()30Size_t struct_size() 31 { 32 return sizeof(struct huge_struct); 33 } 34 struct_a_offset()35Size_t struct_a_offset() 36 { 37 return (Size_t)(&((struct huge_struct *) 0)->a); 38 } 39 main()40int main() 41 { 42 /* Check the exact sizeof value. bufsize is aligned on 256b. */ 43 if (union_size() != sizeof(char) * bufsize) 44 abort(); 45 46 if (struct_size() != sizeof(short) * bufsize + 4*sizeof(int)) 47 abort(); 48 49 if (struct_a_offset() < sizeof(short) * bufsize) 50 abort(); 51 52 return 0; 53 } 54 55