移植至Linux的坑:64位下的long长度

探讨了在将代码从Windows移植到Linux平台时遇到的数据类型长度不一致问题,特别是long类型在两个平台上的不同表现,导致结构体读取错误及解决方案。

目录

 

一.背景

二.错误说明

三.实验

四.结论


一.背景

移植windows代码到linux上的时候,发现同样的文件,同样的代码,在windows上正常,而linux上则出现错误。

二.错误说明

读一个结构体,发现windows上和linux上读出的内容不一致

考虑是windows和linux内存对齐方式不一致造成的,尝试之后,发现64位下linux和windows的内存都是按4字节对齐,于是考虑可能是数据类型长度不一致导致的问题

三.实验

 

struct SHRINK_TILE_INFO
{
	unsigned char  chFileID;	// less than MAX_FILE_NUM
	unsigned char chLayerNo;	// less than MAX_LAYER_SIZE
	int   nX;					// X coordinate in big image
	int   nY;					// Y coordinate in big image
	long lFileOffset;			// tile data offset
	unsigned int dwLength;		// tile data length
};

struct SHRINK_TILE_INFO2
{
	unsigned char  chFileID;	// less than MAX_FILE_NUM
	unsigned char chLayerNo;	// less than MAX_LAYER_SIZE
	int   nX;					// X coordinate in big image
	int   nY;					// Y coordinate in big image
	int lFileOffset;			// tile data offset
	unsigned int dwLength;		// tile data length
};


int main(int argc, char *argv[])
{

    cout<< "long:" << sizeof(long) <<endl;
    cout<< "int:" << sizeof(int) <<endl;
    cout<< "char:" << sizeof(char) <<endl;
    cout<< "unsigned char:" << sizeof(unsigned char) <<endl;
    cout<< "SHRINK_TILE_INFO:" << sizeof(SHRINK_TILE_INFO) <<endl;
    cout<< "SHRINK_TILE_INFO2:" << sizeof(SHRINK_TILE_INFO2) <<endl;
}

对于上面代码。linux上的结果如下

windows上的结果如下

四.结论

显然,windows上的long类型是4个字节,而linux上的long是8个字节,这就导致了移植到linux上之后读带有long类型的结构体时位置错误,从而引发异常。

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值