Solaris取消引用总线错误

时间:2011-06-15 12:48:57

标签: pointers casting solaris

我有一个函数,我试图从大块数据中取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上,这段代码运行正常。据我所知,我没有做任何革命性的事情。这是怎么回事?

1 个答案:

答案 0 :(得分:3)

听起来像对齐问题。在Sun SPARC处理器上,您只能通过指针访问类似short的内容,该指针可被2的幂(通常为8)整除。因此offset = 9的值显然会导致问题。

有关详细信息,请参阅http://blogs.oracle.com/d/entry/on_misaligned_memory_accesses

如果没有更多的背景,我不能推荐任何解决方法;但如果您正在从某些输入源读取数据,则可以使用ntohs读取字节并转换为short(有关详细信息,请参阅ntohs的手册页)。