- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言数据类型大小和结构体中变量的地址分配方法
数据类型:?char??short???int???long???float???double???(long?double)gcc3.2.2:?1??????2??????4?????4???????4???????8???????????12 Visual?C++:1??????2??????4?????4???????4???????8????????????8 对于数组的大小也比较简单,定义数组int?a[10]后,sizeof(a)为所有数组元素大小之和,所以在Visual?C++下其值为40,但是有一种特殊情况: void?function??(int?array[10])?????{?????????printf(\%d\\n\,sizeof(array));?????} int?main(int?argc?,?char?*argv[]) {?????? ???int?array[10]; ???function(array); ???return?1; }? 这里的输出结果是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命令时就会输入?copy?sourcefile?destinationdirectory。 ????共用体变量的所占字节数为最大数据类型成员的大小,例如?union?Union?{?int?i,char??ch};?Union?test;?则test??的大小为4(int类型的大小)。 ????枚举类型变量大小为4字节,本人猜测:编译器为了较好的处理字节对齐问题,将枚举类型变量的大小处理为4,不过至今还没有看到过相关的解释。??? ????结构体类型变量的大小问题是一些公司招聘的时候很受青睐的题目。(本人在一次笔试中和在参加一本数据结构书的校对过程中曾碰到这个问题,遂写此文)在谭的书中没有涉及到这个问题,严格的说这是个跟编译器字节对齐关系挺大的问题,网上可以搜到很多类似问题的讨论。为了使CPU对变量的进行快速高效的访问,变量的起始地址应该满足某些特性,即所谓的对齐。关于字节对齐有两个重要的宏,#pragma?pack?(n)和#pragma?pack?第一个宏是强制编译器一般以n的倍数进行地址对齐(还有特殊情况以小于n的字节数进行对齐),第二个宏结束前面设置的对齐方式,恢复到编译器默认的对齐方式。在Visual?C++下默认的字节对齐数为8。?????结构体中的变量item在结构体中相对于首地址的偏移量应该是?X?的倍数,X?由如下式子确定:X=min(n,sizeof(item)),举个例子(设n为8):struct?Test?{?char?c1;?char?c2;?int?i};??如果定义了变量Test??t?,那么在存储?t?的?i?时?X?就应该是min(8,sizeof(int))即为4的倍数,即?i?相对于结构体首地址的偏移量必须是4的倍数,所以?t?的大小就应该为8字节(在c1和c2后填充了两个字节以满足前述条件)。对于struct?{?char?c1;?char?c2}不会出现填充的的情况,每个成员相对首地址的偏移量也满足是X的倍数(此时X为1),其大小为2字节。?????? 验证程序: #include?stdio.h main() { ?struct?Test ??{char?c1;? ???char?c2;? ????int?i; ??};? ?struct?Test?t; ?t.c1=1; ?t.c2=2; ?t.i=3; ?printf(\%d?%d?%d?%d\\n\,sizeof(t.c1),sizeof(t.c2),sizeof(t.i),sizeof?t); } 输出:1148 ????而对于结构struct?{char?c1;?double?d;},默认情况下这种结构体变量占用16字节(在c1后填充了7个字节以满足字节对齐)。
文档评论(0)