dataalign.c
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * dataalign.c -- show alignment needs
  3.  *
  4.  * This runs with any Linux kernel (not any Unix, because of <linux/types.h>)
  5.  */
  6. #include <stdio.h>
  7. #include <sys/utsname.h>
  8. #include <linux/types.h>
  9. /*
  10.  * Define several data structures, all of them start with a lone char
  11.  * in order to present an unaligned offset for the next field
  12.  */
  13. struct c   {char c;  char      t;} c;
  14. struct s   {char c;  short     t;} s;
  15. struct i   {char c;  int       t;} i;
  16. struct l   {char c;  long      t;} l;
  17. struct ll  {char c;  long long t;} ll;
  18. struct p   {char c;  void *    t;} p;
  19. struct u1b {char c;  __u8      t;} u1b;
  20. struct u2b {char c;  __u16     t;} u2b;
  21. struct u4b {char c;  __u32     t;} u4b;
  22. struct u8b {char c;  __u64     t;} u8b;
  23. int main(int argc, char **argv)
  24. {
  25.     struct utsname name;
  26.     uname(&name); /* never fails :) */
  27.     printf("arch  Align:  char  short  int  long   ptr long-long "
  28.    " u8 u16 u32 u64n");
  29.     printf(       "%-12s  %3i   %3i   %3i   %3i   %3i   %3i      "
  30.    "%3i %3i %3i %3in",
  31.    name.machine,
  32.    /* note that gcc can subtract void * values, but it's not ansi */
  33.    (int)((void *)(&c.t)   - (void *)&c),
  34.    (int)((void *)(&s.t)   - (void *)&s),
  35.    (int)((void *)(&i.t)   - (void *)&i),
  36.    (int)((void *)(&l.t)   - (void *)&l),
  37.    (int)((void *)(&p.t)   - (void *)&p),
  38.    (int)((void *)(&ll.t)  - (void *)&ll),
  39.    (int)((void *)(&u1b.t) - (void *)&u1b),
  40.    (int)((void *)(&u2b.t) - (void *)&u2b),
  41.    (int)((void *)(&u4b.t) - (void *)&u4b),
  42.    (int)((void *)(&u8b.t) - (void *)&u8b));
  43.     return 0;
  44. }