总结结构体对齐时候遇到问题了。

DontKissBossAss 2010-08-24 11:34:05
一个平时爱玩游戏的同学问我结构体对齐了,
把我问住了,去网上查资料千奇百怪。于是想自己总结下,建立好自己的理论,开始验证时候,出问题了


struct test
{
int a;
int b;
short c;
char d[101];
short e;
};

sizeof(test) = ?


另外,求一个大家感觉好点的结构体 位域对齐的帖子。
...全文
170 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
GANZHIABC 2011-04-18
  • 打赏
  • 举报
回复
好像明白点儿了
kanhai1985 2010-08-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 dontkissbossass 的回复:]

struct test
{
int a;
int b;
short c;
char d[101];
short e;
};

总字节数 = 4+4+2+101+1+2+2。红色为填补字节

sizeof(test) = ?


另外,求一个大家感觉好点的结构体 位域对齐的帖子。
[/Quote]
pengzhixi 2010-08-24
  • 打赏
  • 举报
回复
你另外一个贴有详细说明了。
ljhnew 2010-08-24
  • 打赏
  • 举报
回复
看看这个文章吧,结构体、联合体的应用,以及字节对齐和字节序的问题:http://blog.csdn.net/ljhnew/archive/2010/08/22/5829821.aspx
DontKissBossAss 2010-08-24
  • 打赏
  • 举报
回复
本来在应对各种问题,(结构体嵌套又特殊了,除外)都没问题,但是当有数组101以后 就错误了。
DontKissBossAss 2010-08-24
  • 打赏
  • 举报
回复
分开来讲,我认为如下
假设类型为T
$pragma page(N)
struct A{*********};

假设第M个成员是sizeof最大成员
A a

1:第一个成员就是在&a上直接填,填sizeof(第一个成员的T)
2: 第2个成员以后的起始位置必定是MAX(N, sizeof(自身的类型))的整数倍。
3:在拼完整个结构体以后,sizeof(A)必须是M的整数倍,不足的部分,在最后补齐。
DontKissBossAss 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 akirya 的回复:]

默认情况下

type a;

那么a的地址必定在sizeof(type)的整数倍。
结构体的大小必定为 最大成员的整数倍。

剩下的就看你怎么运用这两条了
[/Quote]


恩,但是你这个没有说明 #pragma page的关系,呵呵,我总结呢正,但是在最后一步验证的时候,遇到上边那个结构体,
  • 打赏
  • 举报
回复
默认情况下

type a;

那么a的地址必定在sizeof(type)的整数倍。
结构体的大小必定为 最大成员的整数倍。

剩下的就看你怎么运用这两条了
DontKissBossAss 2010-08-24
  • 打赏
  • 举报
回复
那帖子最好说明 #pragma page(N) 和对齐
lyramilk 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lyramilk 的回复:]

struct test
{
int a; 4字节
int b; 4字节
short c; 2字节
char d[101]; 1字节 * 101
1字节
short e; 2字节
};
[/Quote]

这个有点纰漏,不过下面给的解释没问题,因为这个结构体最大成员是4字节,所以结构体的对其系数是4字节。下面代码可以证明我忽略的2个字节在e之后。

#include <stdio.h>
struct test
{
int a;
int b;
short c;
char d[101];
short e;
};


int main(int argc,char** argv){
struct test k[2];
printf("%d\n",&k[0].e);
printf("%d\n",&k[1]);
return 0;
}



这个结构体就是这样
[Quote=引用 11 楼 lyramilk 的回复:]

struct test
{
int a; 4字节
int b; 4字节
short c; 2字节
char d[101]; 1字节 * 101
1字节
short e; 2字节
2字节
};
[/Quote]
dream17953 2010-08-24
  • 打赏
  • 举报
回复
你可以查看一下他们的地址,我再VC6.0下试了一下,d[101]占了102个字节,也就是和e之间有一个字节是空的,另外在c和d之间加一个 char类型变量的话,d数组的起始地址会变为奇数.e的地址不变.

我懒得想这些了,不想钻角尖,总之了解一些大体的原则,像2楼说的,具体问题可以再不同编译器下测试一下.
lyramilk 2010-08-24
  • 打赏
  • 举报
回复
struct test
{
int a; 4字节
int b; 4字节
short c; 2字节
char d[101]; 1字节 * 101
1字节
short e; 2字节
};




计算机要给数据对齐到它本身大小的整数倍的位置上。
如果这个倍数过大,那么计算机将它填入缓冲时就需要拆开了,这时候就按照对齐系数去对齐。
结构体由它里面最大的成员的对齐系数决定,基本上都是2的某次方。
zwicker 2010-08-24
  • 打赏
  • 举报
回复
结果是116
bobo364 2010-08-24
  • 打赏
  • 举报
回复
char一个是1,int 4,short 2,char[101]就是101个char字符所以是101,总和是116,测试程序如下
#include<stdio.h>
typedef struct
{
int a;//大小4
int b;//大小4
short c;//大小2
char d[101];//大小101
short e;//大小2
}test;

test a;

int main()
{
printf("%d",sizeof(a));//共116
system("pause");
return 0;
}
赵4老师 2010-08-24
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧