字节对齐方式引起的血案
2013-03-25 16:08
309 查看
在现场实施的时候,由于家里的编译环境与现网环境不一致。故需要重新编译。可是当跑到一个代码的时候,程序崩溃了。报Bus error(core dump)。代码很简单。把共享内存里的一个整数数据,付给一个局部变量整形。不过这么简单的一个语句。却崩溃了。而在公司机器上运行却没有任何问题。一开始还是把我郁闷死了。没见过这样的错误。也不知道如何修改。
查了些资料。最后找到: 各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况!而现场的系统是SunOS BXAPP1 5.10 Generic_147440-25 sun4v sparc sun4v。需要字节对齐。一般默认的对齐方式是4个字节。而现在默认的对齐方式无法进行内存访问。
一种规避方式是内存存的是char数组,使用的时候转换成int.当然这个是浪费运行时间,和资源的一种方式。既然知道需要字节对齐,这个时候只需要加上字节对齐命令就可以了。#pragma pack(n) 按N字节来对齐,#pragma pack() 取消对齐。比如以下
#pragma pack(1)
typedef struct
{
char group_id[11];
char product_id[33];
char scope[2];
char acct_book_id[21];
char acct_id[21];
int account_code_id;
int forzen_amount;
int spend_amount;
int balance_amount;
}STRU_GROUP;
#pragma pack()
最后验证,果然通过了。
查了些资料。最后找到: 各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况!而现场的系统是SunOS BXAPP1 5.10 Generic_147440-25 sun4v sparc sun4v。需要字节对齐。一般默认的对齐方式是4个字节。而现在默认的对齐方式无法进行内存访问。
一种规避方式是内存存的是char数组,使用的时候转换成int.当然这个是浪费运行时间,和资源的一种方式。既然知道需要字节对齐,这个时候只需要加上字节对齐命令就可以了。#pragma pack(n) 按N字节来对齐,#pragma pack() 取消对齐。比如以下
#pragma pack(1)
typedef struct
{
char group_id[11];
char product_id[33];
char scope[2];
char acct_book_id[21];
char acct_id[21];
int account_code_id;
int forzen_amount;
int spend_amount;
int balance_amount;
}STRU_GROUP;
#pragma pack()
最后验证,果然通过了。
相关文章推荐
- 关于字节对齐方式的语句用法
- 字节对齐和C/C++函数调用方式学习总结
- struct和 union用 sizeof 看字节对齐,以及__declspec( align( # ) ) 和 #pragma pack()的使用方式
- 字节对齐和C/C++函数调用方式学习总结
- ios下一个4字节对齐引起崩溃的问题
- 关于编译器4字节对齐方式比较
- CORTEX-M3的字节对齐问题引起的Fault
- struct(结构体)的长度以及字节对齐方式
- 字节,半字,字对齐方式详解
- 字节对齐和C/C++函数调用方式学习总结
- 通过#pragma pack(n)改变C编译器的字节对齐方式-及相应的面试题
- struct 字节对齐问题(不包含struct嵌套的讨论以及修改机器的对齐方式的时候),更详细的请参考收藏
- (经典)struct和 union用 sizeof 看字节对齐,以及__declspec( align( # ) ) 和 #pragma pack()的使用方式
- 通过#pragma pack(n)改变C编译器的字节对齐方式
- 字节、半字、字对齐方式详解
- vc中字节的对齐方式
- ARM程序由于字节对齐引起的问题深入分析
- C编译器的字节对齐方式
- 字节对齐设置的两种方式
- 通过#pragma pack(n)改变C编译器的字节对齐方式