C语言中:结构体内部定义的不同类型的变量分配地址是不是连续的?
6个回答
展开全部
您好!
这个问题要涉及到一个叫“对齐基数”的问题(具体到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....
希望会对你有帮助!
这个问题要涉及到一个叫“对齐基数”的问题(具体到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....
希望会对你有帮助!
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
展开全部
是连续的,跟定义数组一样,同一个集合的在一起。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-05-02
展开全部
不是连续的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
地址分配时连续的。但说到结构体关键在于内存对齐,这个具体你可以看看百科。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
OK
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询