我有一个函数,我试图从大块数据中取16位。我在Solaris机器上运行此代码,我可以在没有警告或错误的情况下编译。但是,当我运行此代码时,无论何时它到达我的de-deference我的指针的部分,我立即得到一个总线错误。代码看起来像:
void find_info(unsigned char* packet) {
int offset = 9;
uint16_t short_value = *(uint16_t*)(packet+offset);
}
当我试图取消引用“数据包+偏移”指针以获得短路时,发生总线错误。我知道在数据包[offset]和数据包[offset + 1]处有数据。在Linux和Cygwin上,这段代码运行正常。据我所知,我没有做任何革命性的事情。这是怎么回事?
答案 0 :(得分:3)
听起来像对齐问题。在Sun SPARC处理器上,您只能通过指针访问类似short的内容,该指针可被2的幂(通常为8)整除。因此offset = 9的值显然会导致问题。
有关详细信息,请参阅http://blogs.oracle.com/d/entry/on_misaligned_memory_accesses。
如果没有更多的背景,我不能推荐任何解决方法;但如果您正在从某些输入源读取数据,则可以使用ntohs读取字节并转换为short(有关详细信息,请参阅ntohs的手册页)。