Linux下gcc编译得问题

ajsword 2003-11-13 05:18:49
相同得C文件,在两个linux系统下用gcc编译,执行得时候发现用sizeof计算出来得结构体大大小不同,虽然知道是位对齐方面的问题,有什么好得方法解决吗,怎么解决
...全文
32 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ajsword 2003-11-14
  • 打赏
  • 举报
回复
又沉下去啦:(
fxiangh 2003-11-14
  • 打赏
  • 举报
回复
第一招:
malloc(SIZE)

第二招:
用联合
union {
struct XXX;
char buf[SIZE];
} SOMETYPE;
ajsword 2003-11-14
  • 打赏
  • 举报
回复
能否解释一下代码得含义,谢谢
还有能不能修改编译器得选项,怎么改
ajsword 2003-11-14
  • 打赏
  • 举报
回复
如果是要修改编译器得选项应该怎么改
kangjian1 2003-11-14
  • 打赏
  • 举报
回复
#define ALIGN 2 //如果你的编译器不能4字节对齐只能2字节对齐,就要有着一句

typedef struct tagXXX //你定义的结构
{
char a;
#if ALIGN_2 //如果是2字节对齐
char pad[3]; //填补3个空字节
#endif
int b;
}XXX;

这个方法是一些操作系统为了避免你说的问题所采用的常见的方法
踏岸寻柳 2003-11-14
  • 打赏
  • 举报
回复
sizeof的结果同编译器有关,不同的编译器结果可能不同的;
该结果又与编译选项有关,同一个编译器不同的编译选项结果可能不同。
kangjian1 2003-11-13
  • 打赏
  • 举报
回复
抛开第二点不说,在第一种情况往往采用如下的定义方法:
#define ALIGN 2

typedef struct tagXXX
{
char a;
#if ALIGN_2
char pad[3];
#endif
int b;
}XXX;

(注意char型不会对齐)
kangjian1 2003-11-13
  • 打赏
  • 举报
回复
这有2方面的原因:
1.编译器往往有一个选项,是为了确定结构内成员的对齐方式,比如:
typedef struct tagXXX
{
char a;
int b;
}XXX;
如果采用"以4字节对齐"那么sizeof(XXX)应该是8,即在a后面空了3个字节,
以达到让b的地址是4的整数倍.
如果采用"以2字节对齐"那么sizeof(XXX)应该是6,即在a后面空了1个字节,
以达到让b的地址是2的整数倍.
具体要看编译器的选项.

2.可能是系统的位数不同.在16位机上int是2个字节而在32位上是4个字节.
new1mm 2003-11-13
  • 打赏
  • 举报
回复
为什么一定要相同呢?
ajsword 2003-11-13
  • 打赏
  • 举报
回复
up

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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