Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20005
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 92
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-09 09:42
文章分类

全部博文(13)

文章存档

2014年(13)

我的朋友

分类: C/C++

2014-09-17 12:48:14

今天重新看《c语言深度剖析》,看到空结构体哪里,做了个测试,发现与书中结果不一致:

 

 struct student{

  }stu;

  printf("\n the size of stu===============%d\n", sizeof(stu));


================结果===============

关于空结构体的大小

=====================================以下是书中原文========================================

结构体所占的内存大小是其成员所占内存之和(关于结构体的内存对齐,请参考预处理那章)。这点很容易理解,但是下面的这种情况呢?

struct student

{

}stu;

sizeof(stu)的值是多少呢?在Visual C++ 6.0 上测试一下。

很遗憾,不是0,而是1。为什么呢?你想想,如果我们把struct student 看成一个模子的话,你能造出一个没有任何容积的模子吗?显然不行。编译器也是如此认为。编译器认为任何一种数据类型都有其大小,用它来定义一个变量能够分配确定大小的空间。既然如此,编译器就理所当然的认为任何一个结构体都是有大小的,哪怕这个结构体为空。那万一结构体真的为空,它的大小为什么值比较合适呢?假设结构体内只有一个char 型的数据成员,那其大小为1byte(这里先不考虑内存对齐的情况).也就是说非空结构体类型数据最少需要占一个字节的空间,而空结构体类型数据总不能比最小的非空结构体类型数据所占的空间大吧。这就麻烦了,空结构体的大小既不能为0,也不能大于1,怎么办?定义为0.5byte?但是内存地址的最小单位是1 byte0.5 byte 怎么处理?解决这个问题的最好办法就是折中,编译器理所当然的认为你构造一个结构体数据类型是用来打包一些数据成员的,而最小的数据成员需要1 byte,编译器为每个结构体类型数据至少预留1 byte的空间。所以,空结构体的大小就定位1 byte

阅读(298) | 评论(0) | 转发(0) |
0

上一篇:Linux用户态和内核态

下一篇:没有了

给主人留下些什么吧!~~