C语言中:结构体内部定义的不同类型的变量分配地址是不是连续的?

各个不同类型的变量的地址分配都是连续的?那作用不就相当于数组形式了?

您好!
这个问题要涉及到一个叫“对齐基数”的问题(具体到http://baike.baidu.com/view/4786260.htm查看),先说解决方法:
如果你的结构体中最小成员变量为char型,可在程序开始增加#pragma pack(1)这样的语句,其他的类推,如最小成员变量为short型,那就把1变成2(不知道你用的什么环境,由于我目前用的vc、vs,其他环境未做尝试,所以不太明了)

具体规则如下:

(1)、结构体变量的首地址要能被其最宽的基本类型成员的大小和编译器对齐基数中较小的(暂把这个数称作“当前对齐基数”)所整除(32位系统,vc6.0默认对齐基数是8)。

(2)、结构体每个成员相对于结构体首地址的偏移量都是当前对齐基数的整数倍,如有需要编译器会在成员之间加上填充字节

(3)、结构体的总大小为当前对齐基数的整数倍,如有需要编译器会再最末一个成员之后加上填充字节

这么几条规则,看起来不好懂,其实很简单,你的这个问题主要用到第二、三条,举个例子(vc6.0下):
struct test
{
char c1;
float f;
char c2;
}
这个结构体中,char为1字节,float为4字节,但是sizeof(struct test)却是12字节,这里面就是“对齐基数”的作用。根据上面的结论,对于这个结构体,它的当前对齐基数是4,虽然char c1只有一字节,但是编译器会给他后面添加3字节的填充字节,让float的地址对齐到4字节,所以c1和f的实际地址是不连续的,c2同理,所以这个结构体的大小是12字节。

如果确实需要,可以更改vc默认对齐基数,就用上面的语句:#pragma pack(n),其中n改成需要的值就可以了,一般为1,2,4,8....

希望会对你有帮助!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-02
是连续的,跟定义数组一样,同一个集合的在一起。本回答被提问者采纳
第2个回答  2012-05-02
不是连续的
第3个回答  2012-05-02
地址分配时连续的。但说到结构体关键在于内存对齐,这个具体你可以看看百科。
第4个回答  2012-05-02
OK
相似回答