当前位置: 技术问答>linux和unix
Linux下gcc编译得问题
来源: 互联网 发布时间:2015-05-12
本文导语: 相同得C文件,在两个linux系统下用gcc编译,执行得时候发现用sizeof计算出来得结构体大大小不同,虽然知道是位对齐方面的问题,有什么好得方法解决吗,怎么解决 | 这有2方面的原因: 1.编译器往往...
相同得C文件,在两个linux系统下用gcc编译,执行得时候发现用sizeof计算出来得结构体大大小不同,虽然知道是位对齐方面的问题,有什么好得方法解决吗,怎么解决
|
这有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个字节.
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个字节.
|
sizeof的结果同编译器有关,不同的编译器结果可能不同的;
该结果又与编译选项有关,同一个编译器不同的编译选项结果可能不同。
该结果又与编译选项有关,同一个编译器不同的编译选项结果可能不同。
|
第一招:
malloc(SIZE)
第二招:
用联合
union {
struct XXX;
char buf[SIZE];
} SOMETYPE;
malloc(SIZE)
第二招:
用联合
union {
struct XXX;
char buf[SIZE];
} SOMETYPE;