您的位置:首页 > 其它

我计算结构体和联合体大小的方法

2015-09-09 21:06 246 查看
#include <stdio.h> 
struct A
 {
     int i;
     char ch[9];
          
 };      
         
 void main()
 {       
    struct A a;
     printf("%d\n",sizeof(a));
 }


我说一下我的小经验,就是所谓的“字节对齐”,我是把结构体里面的所以数据都看成4个字节对齐,如果不够就补齐,多了就留下4个剩下的

再放到一边给再凑齐4个。

用我的道理还分析一下上面的程序。

i 是4个字节的,OK ,再看 ch[9]一共是9个字节,按照我说的来它有9个字节,我们留下4个,然后把剩下的5个放一边,然后再拿出4个,还剩下1个,这个时候再看后面有没有字节跟它补齐,没有,系统会跟它自动补齐,加起来是4,4,4,1+3 16个。然后我们把代码改一下,char ch[9]放前面,int i放后面,再来用我们的办法来计算,4,4,1+3,4答案也是16. (1+3是因为它最后只剩1个字节了,而后面的i是4个字节,不能跟它补齐,所以系统会自动跟它补齐)

其实我曾经想过如果我的数据大小分别是 3 ,4,1(大小是8还是12呢)<这2个答案这就慢慢体会>

结果证明我说的对了答案是12,这就是我们为什么上面说当你字节不够的时候它会先跟你找后面有没有正好可以补齐的数据大小,而不是从这个数据中取出一部分给你,如果不能满足,系统会自己跟你补齐,而不是用下一个数据的大小,我觉得是因为它既然是4字节对齐,那么它写数据和读数据应该也是4个字节吧,如果从别的数据把他的内存大小给你,读岂不是混乱了么?

#include <stdio.h>
 
 struct A
 {
     
     char ch[3];//3
     int   i; //4
     char   c; //1
          
 };      
         
 void main()
 {       
    struct A a;
     printf("%d\n",sizeof(a));
 }


上面运行结果为12

今天是9月25号,又看到了求union--sizeof的题目所以更新一下

union中可以定义多个成员,union的大小由最大的成员的大小决定。

#include <stdio.h>
  
  union
  {
      int a;
      char b[17];
  }u; 
  
 void main()
  {
      printf("%d\n",sizeof(u));
      
  }
运行结果为20(4字节对齐)

如果我把char b[ 17]改为char b[14] 结果为16,改为4结果为4,改为5结果为8.........

我们可以看出,这个联合体内,最大的是char b 占17个字节,但是我们是4字节对齐,所以答案是大于17的最小的4的倍数 为20(联合体求大小比结构体还是简单许多的)

如果我们联合体内只有一个char 类型的变量,则我们的大小就为1.总的来说大小就是1,4,8,16,20.....(4的倍数中)最接近联合体内最大字节数的数。

对某一个成员赋值,会覆盖其他成员的值(也不奇怪,因为他们共享一块内存。但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节)

下面给2个简单的例子,大家好好体会吧。

#include <stdio.h>
  
  typedef union
  {
      int a;
      char b;
  }u;
  
  void main()
  
  {
      u dem;
      dem.b='h';
      dem.a=5;
  
     printf("char=%c  int=%d\n",dem.b,dem.a);
   
                      
   }



#include <stdio.h>
  
  typedef union
  {
      int a;
      char b;
  }u;
  
  void main()
  
  {
      u dem;
      dem.a=5;
      dem.b='h'
     printf("char=%c  int=%d\n",dem.b,dem.a);
   
                      
   }

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: