当前位置: 技术问答>linux和unix
总线出错 (核心转储)
来源: 互联网 发布时间:2016-12-16
本文导语: 运行下面代码的时候总会出现 总线错误(核心转储)的错误 memset(sIP,0,sizeof(sIP)); iPort = 0; bInit = false; //ceshi--- strcpy(sIP,"10.10.12.162"); iPort = 1111; struct sockaddr_in &addr = (struct sockaddr_in &)m_addrPeer; ...
运行下面代码的时候总会出现 总线错误(核心转储)的错误
memset(sIP,0,sizeof(sIP));
iPort = 0;
bInit = false;
//ceshi---
strcpy(sIP,"10.10.12.162");
iPort = 1111;
struct sockaddr_in &addr = (struct sockaddr_in &)m_addrPeer;
addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
inet_aton(sIP, (in_addr*)&addr.sin_addr.s_addr);//这一句
调试结果:
Program received signal SIGBUS, Bus error
si_code: 1 - BUS_ADRALN - Invalid address alignment.
为啥?
memset(sIP,0,sizeof(sIP));
iPort = 0;
bInit = false;
//ceshi---
strcpy(sIP,"10.10.12.162");
iPort = 1111;
struct sockaddr_in &addr = (struct sockaddr_in &)m_addrPeer;
addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
inet_aton(sIP, (in_addr*)&addr.sin_addr.s_addr);//这一句
调试结果:
Program received signal SIGBUS, Bus error
si_code: 1 - BUS_ADRALN - Invalid address alignment.
为啥?
|
我来回答~
这个问题是因为,Linux操作系统会对于 非对齐内存访问的进程,发送SIGBUS的信号,你的程序,接收到这个信号后,进行coredump,并退出了。
Windows操作系统允许 非地址对齐的内存访问(会损失性能),所以程序在Windows操作系统下,不会出现app error。
内存地址对齐,对于增加cache命中率,从而间接提高应用程序的性能有很大帮助。
你如果想要在不改变当前编译链接环境和操作系统的情况下,使得程序不出现地址对齐问题,可以想办法,使得你的数据结构进行内存地址的对齐。例如,进行一些字节的填充等等。
具体请参考我的博客:
http://blog.csdn.net/iterzebra/article/details/6232079
http://blog.csdn.net/iterzebra/article/details/6232039
这个问题是因为,Linux操作系统会对于 非对齐内存访问的进程,发送SIGBUS的信号,你的程序,接收到这个信号后,进行coredump,并退出了。
Windows操作系统允许 非地址对齐的内存访问(会损失性能),所以程序在Windows操作系统下,不会出现app error。
内存地址对齐,对于增加cache命中率,从而间接提高应用程序的性能有很大帮助。
你如果想要在不改变当前编译链接环境和操作系统的情况下,使得程序不出现地址对齐问题,可以想办法,使得你的数据结构进行内存地址的对齐。例如,进行一些字节的填充等等。
具体请参考我的博客:
http://blog.csdn.net/iterzebra/article/details/6232079
http://blog.csdn.net/iterzebra/article/details/6232039
|
类型不对,试试
inet_aton(sIP, (in_addr*)&addr.sin_addr.s_addr);//这一句
改为
inet_aton(sIP, &addr.sin_addr);
inet_aton(sIP, (in_addr*)&addr.sin_addr.s_addr);//这一句
改为
inet_aton(sIP, &addr.sin_addr);
|
试试inet_aton(sIP, (in_addr*)&addr.sin_addr);//这一句
另外,struct sockaddr_in &addr = (struct sockaddr_in &)m_addrPeer
有点怪怪的,试试
struct sockaddr_in &addr = (struct sockaddr_in *)&m_addrPeer;
另外,struct sockaddr_in &addr = (struct sockaddr_in &)m_addrPeer
有点怪怪的,试试
struct sockaddr_in &addr = (struct sockaddr_in *)&m_addrPeer;
|
struct sockaddr_in &addr = (struct sockaddr_in &)m_addrPeer;
--------------------------------------------------------
这里是取地址还是声明引用?取地址用&,声明指针使用*,强制转换也需要*
--------------------------------------------------------
这里是取地址还是声明引用?取地址用&,声明指针使用*,强制转换也需要*
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。