移植至Linux的坑:64位下的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类型的结构体时位置错误,从而引发异常。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值