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的手册页)。