【问题标题】:Solaris de-referencing bus errorSolaris 取消引用总线错误
【发布时间】:2011-06-15 12:48:57
【问题描述】:

我有一个函数,我试图从大量数据中获取 16 位。我在 Solaris 机器上运行此代码,并且可以在没有警告或错误的情况下进行编译。但是,当我运行此代码时,每当它到达我取消对指针的尊重的部分时,我都会立即收到总线错误。代码如下所示:

void find_info(unsigned char* packet) {

int offset = 9;
uint16_t short_value = *(uint16_t*)(packet+offset);

}

当我试图取消引用“数据包+偏移”指针以缩短时,会发生总线错误。事实上,我知道数据包 [offset] 和数据包 [offset+1] 处有数据。在 Linux 和 Cygwin 上,此代码运行良好。据我所知,我没有做任何革命性的事情。这是怎么回事?

【问题讨论】:

    标签: pointers casting solaris


    【解决方案1】:

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

    更多详情请见http://blogs.oracle.com/d/entry/on_misaligned_memory_accesses

    如果没有更多上下文,我不能推荐任何解决此问题的方法;但如果您从某个输入源读取数据,您可以只读取字节并使用 ntohs 转换为短字节(有关详细信息,请参阅 ntohs 手册页)。

    【讨论】:

    • 非常有趣。我将不得不进行更多实验,但感谢您指引我正确的方向。
    猜你喜欢
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多