C/C++基础之sizeof使用( 二 )

  • 指针变量的 sizeof 值与指针所指的对象类型没有任何关系 , 与指针申请多少空间没有关系 , 所有的指针变量所占内存大小均相等 。
  • 如果使用 32 位编译器编译得到程序是 32 位 , 那么在 64bits 系统下 , 指针变量大小仍然是 4 个字节 。
3 函数类型的 sizeof函数类型以其返回类型作为自身类型 , 进行 sizeof 取值 。
void fun1(){}int fun2(){   return 0;}double fun3(){   return 0.0;}cout << sizeof(fun1()) << endl;  //错误!无法对void类型使用sizeofcout << sizeof(fun2()) << endl;  //fun2()返回值类型为int , 输出4cout << sizeof(fun3()) << endl;  //fun3()返回值类型为double , 输出8
  • 注意:不能对返回 void 函数和函数指针进行 sizeof 取值 。
4 数组类型的 sizeof当 sizeof 作用于数组时 , 求取的是数组所有元素所占用的大小 。
    int A[3][5];    char c[]="abcdef";    double*(*d)[3][6];    cout<<sizeof(A)<<endl;      //输出60    cout<<sizeof(A[4])<<endl;   //输出20    cout<<sizeof(A[0][0])<<endl;//输出4    cout<<sizeof(c)<<endl;      //输出7    cout<<sizeof(d)<<endl;      //输出4    cout<<sizeof(*d)<<endl;     //输出72    cout<<sizeof(**d)<<endl;    //输出24    cout<<sizeof(***d)<<endl;   //输出4    cout<<sizeof(****d)<<endl;  //输出8A 的数据类型是 int[3][5]  , A[4] 的数据类型是 int[5] , A[0][0]数据类型是 int。所以:
sizeof(A)==sizeof(int[3][5])==3*5*sizeof(int)==60sizeof(A[4])==sizeof(int[5])=5*sizeof(int)==20sizeof(A[0][0])==sizeof(int)==4如果字符数组表示字符串 , 数组末自动插入 '' , 所以 c 的数据类型是 char[7]  , 所以 sizeof(c)=sizeof(char[7])==7 。
d 是一个很奇怪的定义 , 他表示一个指向 double*[3][6] 类型数组的指针 。既然是指针 , 所以 sizeof(d) 就是4 。
既然 d 是执行 double*[3][6] 类型的指针 ,  *d 就表示一个 double*[3][6] 的多维数组类型 , 因此 sizeof(*a)=3*6*sizeof(double*)=72。
**d 表示一个 double*[6] 类型的数组 , 所以 sizeof(**d)=6*sizeof (double*)=24 。
***d 表示其中的一个元素 , 也就是 double*  , 所以 sizeof(***d)=4。
****d 是一个 double  , 所以 sizeof(****d)=sizeof(double)=8 。
当数组作为函数形参时 , 下面输出结果应该是多少呢?
int GetStrLength(char str[]){   return sizeof(str);}int main(){   char szStr[] = "abcdef";   cout<< GetStrLength() << endl;   return 0;}输出不是 7  , 这里函数参数 str[] 已不再是数组类型 , 而是蜕变成指针 , 我们调用函数 GetStrLength() 时 , 程序会在栈上分配一个大小为 7 的数组吗?不会!数组是“传址”的 , 调用者只需将实参的地址传递过去 , 所以 str 自然为指针类型 (char*)  , 输出值为:4。
  • 数组的大小是各维数的乘积*数组元素的大小 。
  • 向函数形参传递数组 , 数组将会退化为指针 , 失去原来数组的特性 。
4 结构体类型的 sizeof对于 struct 数据结构由 CPU 的对齐问题导致 struct 的大小变得比较复杂 。具体可以查看以前的文章一文轻松理解内存对齐 。
理论上 , int 占 4byte  ,  char 占一个 byte  , 那么将它们放到一个结构体中应该占 4+1=5byte ;但是实际上 , 通过运行程序得到的结果是 8byte。
#include<stdio.h>struct{    int x;    char y;}Test;int main(){    printf("%dn",sizeof(Test)); // 输出8不是5    return 0;}结构体的大小跟结构体成员对齐有密切关系 , 而并非简单地等于各个成员的大小之和!比如对如下结构体两个结构体 A、B 使用 sizeof 的结果分别是:16,24 。可以看出 sizeof(B) 并不等于 sizeof(int)+sizeof(double)+sizeof(int)=16。


推荐阅读