


全文预览已结束
VIP免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言数据类型大小和结构体中变量的地址分配方法点击:855 发布日期:2007-9-11 13:47:06 进入论坛数据类型:charshortintlongfloatdouble(longdouble) gcc3.2.2:12444812 VisualC+:1244488 对于数组的大小也比较简单,定义数组inta10后,sizeof(a)为所有数组元素大小之和,所以在VisualC+下其值为40,但是有一种特殊情况: voidfunction(intarray10)printf(%dn,sizeof(array); intmain(intargc,char*argv) intarray10; function(array); return1; 这 里的输出结果是4,因为C语言在数组作为参数的时候传递的只是地址,也就是在function这个函数用到的array只不过是个指针变量,其结果返回是 4,因为:在Win32平台上地址为32位即指针变量的大小为4字节。顺便提一下关于main中那两个形式参数的意义,假定此main函数编译后为 Test.exe的入口。如果在命令行模式(Windows下为cmd,Linux下的shell)运行时,如果你输入Test字符串1字符串2, 那么系统在调用此main函数时就会把3传给argc(调用此程序的参数个数输入了3个,程序名也算作一个参数),把“Test”“字符串1”“字符 串2”存入字符指针数组argv中,在main函数中就可以使用这些传入的参数了,这样的例子有很多,比如在命令行下运行copy命令时就会输入 copysourcefiledestinationdirectory。 共用体变量的所占字节数为最大数据类型成员的大小,例如unionUnioninti,charch;Uniontest;则test的大小为4(int类型的大小)。 枚举类型变量大小为4字节,本人猜测:编译器为了较好的处理字节对齐问题,将枚举类型变量的大小处理为4,不过至今还没有看到过相关的解释。 结构体类型变量的大小问题是一些公司招聘的时候很受青睐的题目。(本人在一次笔试中和在参加一本数据结构书的校对过程中曾碰到这个问题,遂写此文)在谭的 书中没有涉及到这个问题,严格的说这是个跟编译器字节对齐关系挺大的问题,网上可以搜到很多类似问题的讨论。为了使CPU对变量的进行快速高效的访问,变 量的起始地址应该满足某些特性,即所谓的对齐。关于字节对齐有两个重要的宏,#pragmapack(n)和#pragmapack第一个宏是强 制编译器一般以n的倍数进行地址对齐(还有特殊情况以小于n的字节数进行对齐),第二个宏结束前面设置的对齐方式,恢复到编译器默认的对齐方式。在 VisualC+下默认的字节对齐数为8。C语言数据类型大小和结构体中变量的地址分配方法点击:855 发布日期:2007-9-11 13:47:06 进入论坛 结构体中的变量item在结构体中相对于首地址的偏移量应该是X的倍数,X由如下式子确定:X=min(n,sizeof(item),举个例子 (设n为8):structTestcharc1;charc2;inti;如果定义了变量Testt,那么在存储t 的i时X就应该是min(8,sizeof(int)即为4的倍数,即i相对于结构体首地址的偏移量必须是4的倍数,所以t的大小就应 该为8字节(在c1和c2后填充了两个字节以满足前述条件)。对于structcharc1;charc2不会出现填充的的情况,每个成员 相对首地址的偏移量也满足是X的倍数(此时X为1),其大小为2字节。 验证程序: #include main() structTest charc1; charc2; inti; ; structTestt; t.c1=1; t.c2=2; t.i=3; printf(%d%d%d%dn,sizeof(t.c1),sizeof(t.c2),sizeof(t.i),sizeoft); 输出:1148 而对于结构structcharc1;doubled;,默认情况下这种结构体变量占用16字节(在c1后填充了7个字节以满足字节对齐)。 如果强制编译器以4字节对齐,即在声明这种结构的变量前面有#pragmapack(4),此时X为4,则此种类型结构体变量占用的内存为12字节。 再看structcharc1;doubled;charc2;在默认字节对齐的方式下,输出其大小为24,呵 呵,这是因为编译器还有一条规定:结构体变量的大小必须要为X(同上定义)的倍数,如果不满足,就会在最后一个成员后填充最少字节数以满足此条件。如果 定义此结构体前有#pragmapack(4),则输出大小为16。 还有一种特殊情况,就是空结构体。在VisualC+下其 大小为1,即struct类型的变量在VC下输出其大小是1,解释就是VC为每个结构体变量分配一个字节的内存,以使该变量有个地址;而在gcc下输 出其大小为0,我的理解是既然此结构体一个成员都没有,程序中就不会访问它,因此也不必分配内存,如果编译器碰到有访问此结构体成员的情况就会报错。 最后一种情况,结构体成员中有结构体成员的情况,如structtest1charc1;inti;charc2; structtest2inti;structtest1t1;charc2;此时考虑在确定上述的X时会把 t1拆散成基本数据类型来处理,而考虑test2结构大小时又会把t1作为一个整体来对待,但此时所谓的整体是把test1中确定的那个最大的X拿出来来 确定test2的X。故默认情况下,结构test2类型变量的大小为:20(test1中最大的X被确定为4,test2中也为4,t1占12个字节, 在c2后又填充了3字节,总共20字节)。举个例子:C语言数据类型大小和结构体中变量的地址分配方法点击:856 发布日期:2007-9-11 13:47:06 进入论坛structtest1charc1;doubled
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 望舌苔试题及答案
- 网络员考试试题及答案
- 土木识图试题及答案
- 2025年机械设备维护与保养协议书
- 规避环保问题对企业运营的影响
- 2025年合作方分手协议书范文
- 事业单位房屋管理的现状及总体形势
- 推进绿色发展助力经开区可持续发展
- 土壤改良对油菜产量的影响
- 赣州市章贡区三年级2024-2025学年上学期英语期末试卷:词汇拼写与语法综合能力挑战2025
- 人文英语1-国开机考答案
- ZYJ型压风供水自救装置培训
- 员工下班喝酒意外免责协议书
- 重庆市开州区2022-2023学年七年级下学期语文期末试卷(含答案)
- 无责任人道主义赔偿协议书
- 四川省德阳市绵竹市2024年八年级二模生物、地理试题+-
- 杨浦区2022-2023学年八年级下学期期末数学试卷及答案(上海沪教版)
- DB37-T 5081-2024 住宅烟气集中排放系统技术标准
- 《短视频拍摄与制作》课件-3短视频中期拍摄
- DB11∕T 1254-2022 再生水热泵系统工程技术规范
- 2024届上海市徐汇区八年级下册数学期末考试试题含解析
评论
0/150
提交评论