sizeof的使用注意问题

咱们神马废话不多说,国际惯例,直接看一下C++代码:

  #include <iostream>
  #include<stdio.h>
  #include<string.h>
  #include<stdlib.h>
  using namespace std;

  struct{
      short a1;
      short a2;
      short a3;
  }A;

  struct{
      long a1;
      short a2;
  }B;

  int main()
  {
    char* ss1="0123456789";
    char ss2[]="0123456789";
    char ss3[100]="0123456789";
    int ss4[100];
    char q1[]="abc";
    char q2[]="a\n";
    char*q3="a\n";
    char *str1=(char *)malloc(100); //这里使用malloc向系统申请100个自己的内存空间
    void *str2=(void *)malloc(100);

    cout<<sizeof(ss1)<<" ";//ss1是一个字符指针,指针的大小事个定值,占4个字节,所以结果为4
    cout<<sizeof(ss2)<<" ";//ss2是个字符数组,用来存放固定长度的字符,占10+1(结束符\0算一个),所以结果是11
    cout<<sizeof(ss3)<<" ";//ss3和ss2类似,不过这里声明的数组容量是100,所以结果为100
    cout<<sizeof(ss4)<<" ";//ss4是一个整形数组,每个int占4个字节,所以这里是4*100=400,结果为400
    cout<<sizeof(q1)<<" ";//q1和ss2类似,结果为4
    cout<<sizeof(q2)<<" ";//q2中\n算一个字符,所以结果为3
    cout<<sizeof(q3)<<" ";//q3是个字符指针,占固件大小,结果为4
    cout<<sizeof(A)<<" ";// 详情看下方的解释,结果为6
    cout<<sizeof(B)<<" ";//详情看下方的解释,结果为8
    cout<<sizeof(str1)<<" ";// 指针变量的固定大小都为4
    cout<<sizeof(str2)<<" ";//指针变量的固定大小都为4


    return 0;
  }
    关于结构体:A和B是两个结构体,在默认情况下,为了方便对结构体内的元素访问和管理,当结构体内的元素长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说,结构体的长度一

定是最长元素的整数倍。 如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对其单位,但是结构体内类型相同的连续元素将在连续的空间内,和数组一样。

  所以:结构体A中包含三个short型的数据,每个占2个字节,结构体对齐参数按照默认的8字节对齐,则a1,a2,a3都去2个字节对齐,sizeof(A)为6,也就是2的整数倍。

结构体B中包含long和short型数据,分别占4,2个字节,结构体默认对其参数为8,所以必须补空字节,增到8时才符合条件,则sizeof(B)为8.也就是4的整数倍。

 

运行结果如下图所示:

         

 

posted on 2013-04-12 11:07  Isaber  阅读(151)  评论(0)    收藏  举报

导航