教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 资格考试 >

C专家编程看书笔记(2)

来源:网络收集 时间:2026-08-27
导读: (睡觉了,记得明天看一下学习的时候教材上空间是如何分配的,感觉有出入。) 昨晚睡觉还是再想这里的一些问题,我想通过将结构体中各个类型的地址取出来看看,因为它们是连续的。但又出现一点疑问,是不是由于编译

(睡觉了,记得明天看一下学习的时候教材上空间是如何分配的,感觉有出入。)
昨晚睡觉还是再想这里的一些问题,我想通过将结构体中各个类型的地址取出来看看,因为它们是连续的。但又出现一点疑问,是不是由于编译器不同造成的,很有必要在VC6.0上也进行测试,但我想不是现在,因为我得尽快把这pdf看完。
(《C语言程序设计》<谭浩强>)P309
书中原话:结构体变量所占内存长度是各成员占的内存长度之各。由此看来,至少现在我相信这句话是错的,因为我做的测试还不够。
下面我们来看一下上面说的,返回地址是什么样的。
能说什么呢,测试结果很让我崩渍,推翻了我上面的设想,但设想中也有部分正确,可以说方向正确了。庆幸我做了这块测试,首先我得到了正确的知识,最后,明确深深地理解到内存中字对齐的概念,原来字对齐我一下在喊口号,今天终于明白了,看来很有必要再做下Visual C++6.0下的测试。以上错误的部分,目前不会删除,因为他是我的心血,目前也只是我自己看,如果以后需要我会做相应修改。
继续上例子,唉(我相信下面我不会再是错的了,因为这是实际测试出来的),以下例子均是本机测试的值:
struct node_tag10{
char test0;
double test1;
short test2;
}c;
&char = 134518404,&double = 134518408,&short = 134518416.sizeof(c) = 16.
struct node_tag10{
char test0;
double test1;
short test2;
char test3;
}c;
&char = 134518432,&double = 134518436,&short = 134518444,&char = 134514446.sizeof(c) = 16.
struct node_tag10{
char test0;
double test1;
short test2;
char test3;
char test4;
}c;
&char = 134518440,&double = 134518444,&short = 134518452,&char = 1345184
54,&char = 134518455.sizeof(c) = 16.
struct node_tag10{
char test0;
double test1;
short test2;
char test3;
short test4;
char test5;

C专家编程学习中的笔记

}c;
&char = 134518468,&double = 134518472,&short = 134518480,&char = 134518482,&short = 134518484,&char = 134518486.sizeof(c) = 20.注意如果按以前我的认为,这里将会是16。
struct node_tag10{
char test0;
double test1;
short test2;
char test3;
short test4;
char test5;
char test6;
}c;
&char = 134518480,&double = 134518484,&short = 134518492,&char = 134518494,&short = 134518496,&char = 134518498,&char = 134518499.sizeof(c) = 20.注意如果按以前我的认为,这里将会是16。
struct node_tag10{
char test0;
short test1;
double test2;
short test3;
char test4;
short test5;
char test6;
char test7;
}c;
&char = 134518508,&short = 134518510,&double = 134518512,&short = 134518520,&char = 134518522,&short = 134518524,&char = 134518526,&char = 134518527.sizeof(c) = 20.
struct node_tag10{
short test0;
double test1;
short test2;
char test3;
short test4;
char test5;
char test6;
}c;
&short = 134518480,&double = 134518484,&short = 134518492,&char = 134518494,&short = 134518496,&char = 134518498,&char = 13451899.sizeof(c) = 20.
由上面这些可得,第一个分配地址总是能被4整除的,32位机,便于寻址。后面出现的类型(如int,double等)只要所占字节数大于或等于4个字节,也将会从能被4整除的地址开始,且与前面地址是连续的。下面这个能很好说明:
struct node_tag10{
char test0;
double test1;
short test2;
char test3;
short test4;
char test5;
}c;
&char = 134518468,&double = 134518472,&short = 134518480,&char = 134518482,&short = 134518484,&char = 134518486.sizeof(c) = 20.注意如果按以前我的认为,这里将会是16。
最后还是做一下Visual C++6.0上的测试:
sizechar = 1;sizeshort = 2;sizeint = 4;sizelong = 4;sizefloat = 4;sizedouble = 8;sizelongdouble = 8.
struct node_tag10{
short test0;
double test1;
short test2;
char test3;
short test4;
char test5;
char test6;
}c;
&short = 4339136,&double = 4339144,&short = 4339152,&char = 4339154,&short = 4339156,&char = 4339158,&char = 4339159.sizeof(c) = 24.与虚拟机上不同,无论第一个类型变成char,short,int,double都会占8个字节,除非一个也不要,就不会占8个字节。
将double改成int,前面第一个类型(char,short)会只占4个字节了。若改为short,前面的char又只占两上字节了,这,总之一句话,程序里面太多的神奇。
**********************************************************************************************************************************************************************
下午又得
出一点结论:
编译器存在字对齐问题,将以结构体中占字节最多的类型来对齐。(不同的平台,会有区别,就如是我的虚拟机(有double存在也会像样int以4个字节做为分配单无)与VC++6.0(有double存在将会以8个字节做为分配单元)结果不一样,这里我们以VC++6.0为准,在不同的平

C专家编程学习中的笔记

台可以实际进行测试,得出相应结果。)
struct node_tag{
char test0;
short test1;
int test2;
char test3;
int test4;
short test5;
};
sizeof(struct node_tag) = 20;虚拟机也是20。

struct node_tag{
char test0;
int test1;
double test2;
char test3;
double test4;
};
sizeof(struct node_tag) = 32;虚拟机是28。这个是分配单元的区别,VC++6.0以8字节,虚拟机上是以4字节。
从这里可以知道,在编写结构体时,我们可以恰当的组织数据类型的顺序,可以节省存储空间。我想,结构体我应该比较明白了吧。

P164
看到共用体,扩展测试:
同理关于共用体,《C语言程序设计》<谭浩强>(第三版)P309
共用体变量所占的内存长度等于最长的成员的长度。这是错误的。
union test{
char a[10];
int i;
}u;
sizeof(u) = 12.
union test{
char a[10];
double i;
}u;
sizeof(u) = 16.
同样,要求字对齐。
union test{
char a[17];
double i;
}u;
sizeof(u) = 24.
union test{
char a[17];
double i;
}u;
sizeof(u) = 20.注意,以8字节为分配单位。

enum test{sun,mon,tue,w …… 此处隐藏:3507字,全部文档内容请下载后查看。喜欢就下载吧 ……

C专家编程看书笔记(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/104901.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)