如何解决Solaris取消引用总线错误
| 我有一个函数,试图从大量数据中获取16位数据。我正在Solaris机器上运行此代码,并且可以在没有警告或错误的情况下进行编译。但是,当我运行此代码时,只要它到达我偏向于指针的那一部分,我都会立即收到总线错误。该代码看起来像:void find_info(unsigned char* packet) {
int offset = 9;
uint16_t short_value = *(uint16_t*)(packet+offset);
}
当我尝试取消引用“ packet + offset \”指针以获取短路时,会发生总线错误。我知道一个事实,在数据包[offset]和数据包[offset + 1]处。在Linux和Cygwin上,此代码可以正常工作。据我所知,我没有做任何革命性的事情。这里发生了什么?
解决方法
听起来像是对齐问题。在Sun SPARC处理器上,您只能通过可被2的整数次幂(通常为8)整除的指针访问short之类的东西,因此offset = 9的值显然会引起问题。
有关更多详细信息,请参见http://blogs.oracle.com/d/entry/on_misaligned_memory_accesses。
在看不到更多上下文的情况下,我不建议任何解决此问题的方法;但是,如果您要从某个输入源读取数据,则可以读取字节并使用ntohs转换为short(有关详细信息,请参见ntohs的手册页)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。