请教结构类型内存对界的问题

vvpaper 2005-03-22 08:39:49
typedef struct
{
char a[5];
char b[5];
char c[10];
int d;

} struct_a;

sizeof(struct_a)=24

但按照缺省的对界规则:
a: 0 1 2 3 4
b: 5 6 7 8 9
c: 10 11 12 13 14 15 16 17 18 19
d: 20 21 22 23

所有的成员都落在自然对界上,最大长度的成员c长度为10,所以结构的对界调节应该为10,
那么这个结构的长度应该为10的整数倍30,应该在23位置后补7个位
那为什么实际得出的长度为24

操作系统:Compaq Tru64 UNIX V5.1
编译器:gcc
...全文
144 点赞 收藏 8
写回复
8 条回复
ypengfei 2005年03月23日
长度1对齐?什么意思,还请高手指点一二。
回复 点赞
yuchengliu 2005年03月23日
struct test
{
char x1;
short x2;
float x3;
char x4;
};
结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,其起始地址必须2字节对界,因此,编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然对界地址上,在它们前面不需要额外的填充字节。在test结构中,成员x3要求4字节对界,是该结构所有成员中要求的最大对界单元,因而test结构的自然对界条件为4字节,编译器在成员x4后面填充了3个空字节。整个结构所占据空间为12字节。

在test结构中,成员x3要求4字节对界,是该结构所有成员中要求的最大对界单元

做如下修改:


#include <iostream>
using namespace std;
struct test
{
char x1;
short x2;
float x3;
char x4;
char x5;
char x6;
char x7;
};

int main()
{
cout << sizeof(test) <<endl;
system("pause");
return 0;
}

12
请按任意键继续. . .

typedef struct
{
char a[5];
char b[5];
char c[10];
int d;

} struct_a;

sizeof(struct_a)=24
上面的高手们都说了
数组不是结构,其在内存中是连续排列的,只和类型有关。

所以最大界的原素是 int d------4
排列结构是以4为边界的。
结果就是24!
回复 点赞
TangChin 2005年03月22日
对,对齐是为了方便CPU进行内存读取
对数组,CPU一次只能读入一个成员,固char型数组是长度1对齐。
回复 点赞
Elandsong 2005年03月22日
跟编译选项有关,你也可以用pragma指定对齐方式。
回复 点赞
cnwolf 2005年03月22日
我感觉应该和编译器有关吧

vc好像是按四字节对齐吧

而编译器应该和操作系统的字长有关吧,32位操作系统按四字节对齐

可以反汇编看看阿
回复 点赞
vvpaper 2005年03月22日
是不是每个成员的对界要为它长度的整数倍,加入成员为int,那这个成员的对界地址就要为4*n的位置上
回复 点赞
dongpy 2005年03月22日
数组是以元素的对齐方式对齐的。
char a[5];
char b[5];
char c[10];
所以这些都是1字节对齐,

int d;4字节对齐,struct_a也是4字节对齐,总数24字节,是4的倍数。
回复 点赞
oo 2005年03月22日
char c[10];
是以char的长度(1)来对齐,跟数组的大小无关
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告