sizeof 相关问题

一、sizeof的概念  

  • sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。
  • sizeof操作符以字节形式给出了其操作数的存储大小。

二、64位Linux系统中的sizeof

(指针跟自己的系统有关,32位系统是4个字节,64位是8个字节)

1、char :                   1个字节(固定)
2、*(即指针变量):        8个字节
3、short int :                2个字节(固定)
4、int:                       4个字节(固定)
5、unsigned int :         4个字节(固定)
6、float:                       4个字节(固定)
7、double:                   8个字节(固定)
8、long:                       8个字节
9、unsigned long:       8个字节(变化*其实就是寻址控件的地址长度数值)
10、long long:             8个字节(固定)

三、联合、结构体的sizeof

1、联合union:sizeof是其最大字节成员的字节数

union  u{ 
    char c;
    double d;
}u;

sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;

2、结构体struct:sizeof是其成员类型的总字节数,包括补充字节在内

struct a{ 
          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。

四、数组的sizeof

当操作数具有数组类型时,其结果是数组的总字节数。
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;   //自动转化为数组类型,最后的'\0'符
 

参考文章:

c语言详解sizeof

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/81152935
今日推荐