C语言中 sizeof

转自:http://www.cnblogs.com/wangkangluo1/archive/2011/09/27/2193072.html

sizeof是C语言的一种单目操作符

sizeof操作符以字节形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。
sizeof(char)= 1;
sizeof(unsigned char) = 1;
sizeof(signed char)= 1;
sizeof(int)= 4;
sizeof(unsigned int)= 4;
sizeof(short int)= 2;
sizeof(unsigned short) = 2;
sizeof(long int)= 4;
sizeof(unsigned long)= 4;
sizeof(float)= 4;
sizeof(double)= 8;
sizeof(long double)= 12;
char *p;      //Linux中
sizeof(p) = 4;
当操作数具有数组类型时,其结果是数组的总字节数。
 例如: char a[5];
          int  b[5];
          sizeof(a) = 5;
          sizeof(b) = 20;
   
当操作数是具体的字符串或者数值时,会根据具体的类型进行相应转化。
 
    例如: sizeof(8)    = 4;  //自动转化为int类型
          sizeof(8.8)  = 8;  //自动转化为double类型,注意,不是float类型
          sizeof("ab") = 3   //自动转化为数组类型,
                             //长度是4,不是3,因为加上了最后的'\n'符
                             //有资料说,会自动转化为指针类型(Linux为4)
                             //可能和操作系统与编译器有关系
         
当操作数是联合类型时,sizeof是其最大字节成员的字节数。
 当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。    
 还是让我们拿例子来说话:
    union  u{             //对union来说
          char c;
          double d;
    }u;
    sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;

  struct a{             //对struct来说
          char b; 
          double x;
    }a;   
  在Linux上: sizeof(a) = 12;
    而一般sizeof(char) + sizeof(double) = 9; 
  这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。
    但如果全对齐的话,sizeof(a) = 16, 这是因为b被放到偏移量为0的地址,占1个字节;
    在存放x时,double类型长度为8,需要放到能被8整除的偏移量上,这时候需要补7个空字节,
    达到8个,这时候偏移量为8,放上x后长度为16。
    在此例中,所有的结构成员都要放在被4整除的地址(Linux的存放方式),这里补3个字节,所以为12。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章