目录
一.背景
移植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类型的结构体时位置错误,从而引发异常。