你真的了解sizeof 么?

sizeof并不是C语言和C++语言中的一个函数,而是一个关键字,一个操作符
它的作用是返回一个对象或者类型名的长度,也就是说这个对象或者类型所占的内存字节数。它的返回值类型为size_t(usinged int),长度的单位是字节。
1)对基本数据类型运用sizeof操作,得到其占用内存的字节数
如 

 
  1. int a;   
  2. double d;   
  3. printf("%d",sizeof a);   
  4. printf("%d"sizeof d);   


它的输出是4 和 8,因为int在内存中占用4个字节,double在内存中占用8个字节。
2)对指针做sizeof操作,得到的将是存放指针所需的内存大小

 
  1. char c = 'c';   
  2. int a = 10;   
  3. double d = 3.14;   
  4. char *cp = &c;   
  5. int *ap = &a;   
  6. double *dp = &d;   
  7. printf("%d %d %d",sizeof (cp),sizeof (ap),sizeof (dp)); // 4 4 4   
  8. printf("%d %d %d",sizeof (*cp),sizeof (*ap),sizeof (*dp)); // 1 4 8   


对于32位的及其来说,每个指针的占用的内存大小都是一个字,亦即32位,也就是4字节,所以第一行输出的是4 4 4 ,对于第二行不用多说,对指针解引用,就是输出的实际上是每个变量的sizeof ,1 4 8

 

3)对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数

 
  1. double a[]={2,4,6,8};   
  2. double *p = a;   
  3. printf("%d %d %d",,sizeof (a),sizeof (*p),sizeof (p)); //32 8 4   


第一个sizeof是输出数组a在内存中的总长度;第二个sizeof实际是输出数组a的第一个元素(p指针指向其第一个元素)2在内存中所占的字节数,因为是double类型,所以输出8;第三个sizeof是输出指针p在内存中所占的字节数,如2)所示,为四个字节。
4)对结构体做sizeof操作时得到的是整个结构体所占用内存的大小,但是需要注意的是,结构体构造的时候不足4字节的类型在内存中实际占用了4个字节,这就是所谓的内存对齐

 
  1. struct c   
  2.  {   
  3.   char c;   
  4.   int a;   
  5.   double d;   
  6.  }cobing;   
  7. printf("%d",sizeof (cobing)); //16   


为什么是16而不是13呢?这是因为虽然char是一个字节,但是在结构体定义的内存中它占用了整整32位,也就是4个字节,加4个字节的int,和8个字节的double,就是16个字节。
对于sizeof始终要记住的就是:它对某个对象或者类型操作,得出的是这个对象或类型在内存中实际占用的字节数,返回的是一个usinged int类型的整数。以上分析均是针对32位的机器。

 

posted @ 2012-03-10 01:12  CobbLiu  阅读(425)  评论(1编辑  收藏  举报