在一次面试中,遇到了VC中处理结构体的问题,由于平时没留意,没有回答出来,感觉很不爽。回来后,认真分析了下,查了些资料,终于找到原因,故以本文给出解答。
本文首先提出了处理VC++中结构体时应注意的一个问题,然后详细分析了存在该问题的原因,最后做实战训练。
注意:
(1)在VC下,下面各类型占字节数为:char->unsigned int ->1; short int ->2; int ->unsigned int ->4; long ->float->4; double ->long double ->8
(2)在TC下,下面各类型占字节数为:char->unsigned int ->1; short int ->2; int ->unsigned int ->2; long ->float->4; double ->8; long double ->10
一、问题提出
首先,我们来看以下两个小程序:
程序1:
#include <stdio.h>
struct struct1
{
char p1;
short int p2;
long p3;
};
main()
{
printf(″the size of the strcu=%d\n″, sizeof(struct1));
return(1);
}
运行结果是:the size of the struct=8
程序2:
#include <stdio.h>
struct struct2
{
char p1;
long p3;
short int p2;
};
main()
{printf(″the size of the struct=%d\n″, sizeof(struct2));
return(1);
}
运行结果是:the size of the struct=12
问题:显然上述两个程序的运行结果是不同的。然而仔细观察上述两个程序,它们的唯一区别是变量p2在结构体struct struct1和struct struct2中的位置不同。而这一不同是如何导致程序运行结果不同呢?
二、VC++中的结构体分析
C语言提供了一种称为结构体的数据类型,它可以将不同类型的数据组合成一个有机整体,这样不但便于引用,而且很清楚地反映出各数据项之间的内在联系,因而在C语言中结构体得到广泛的应用。正如我们已经熟知的那样,在C语言中,结构体的长度等于各数据项长度之和,而且结构体的长度与数据项在其中的位置顺序无关。例如,在TurboC中运行上述两个例子中的程序,得到的结果都是the size of the struct=7。这是由于char数据类型的长度是1,long数据类型的长度是4,而short int数据类型的长度是2,从而得到1+2+4=7。
那么为什么上述两个例子在VC++环境下所得的结果各不相同并且均不是7呢?在实际应用中,我们发现VC++中为结构体变量分配内存时与C语言不同:VC++中为结构体分配内存时,先分配一单位长度(该单位长度的大小等于结构体中占内存最多数据类型,如struct2的单位长度为数据类型long的长度4。),然后在该单位长度中依次为结构中的变量分配空间,直至该单位空间不能再分配完一个完整的变量时为止,就再为该结构体分配另一个单位长度的存储空间。如结构体struct2:首先,分配4个字节,p1占1个字节后,剩余的3个字节不足以分配p3,于是,系统为struct2再分配4个字节分给p3,接着下4个字节分给p2,把以,struct2共有4+4+4=12个字节。再如结构体struct1:同样先分配4个字节,p1占1个字节后,还可为p2分配2个字节,显然剩余的1个字节不足以为p3分配空间了,因此系统还要再为该结构体分配4个字节,该4个字节恰好是p3所需的,所以struct1共有4+4=8个字节。
至此我们便不难理解上述两个例子中的结果是如何算出来的。其中,例1中是4+4=8,而例2中是4+4+4=12。
VC.zip_dialysis
版权申诉
163 浏览量
2022-09-23
10:38:42
上传
评论
收藏 2KB ZIP 举报
weixin_42653672
- 粉丝: 94
- 资源: 1万+
最新资源
- XuGuManager
- python调CANoe
- TA-Lib-0.4.29-cp312-win-amd64.whl
- springboot底层机制实现: zzw-springboot项目
- 06-18-科文22软件-mybatis-spring整合-上午.wmv
- 海信智能电视刷机数据 LED42K600X3D(1001) 生产用软件数据 务必确认机编一致 强制刷机 整机USB升级程序
- 目标检测-手机屏幕表面缺陷检测数据集-1200张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- 「天若有情 」深情版--天下万般兵刃 唯有过往伤人最深.mp3
- 123456daWDdwD
- 用友U810.1数据库字典-只需要1积分
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈