“总线错误”消息是什么意思,它与分段错误有什么不同?


当前回答

当根目录为100%时,我得到一个总线错误。

其他回答

段错误是访问不允许访问的内存。它是只读的,你没有权限等等。

总线错误试图访问不可能存在的内存。您使用了一个对系统没有意义的地址,或者该操作的地址类型是错误的。

这取决于你的操作系统、CPU、编译器以及其他因素。

一般来说,这意味着CPU总线无法完成命令或发生冲突,但这可能意味着一系列事情,具体取决于正在运行的环境和代码。

总线错误现在在x86上很少见,发生在你的处理器甚至不能尝试请求的内存访问时,通常是:

使用具有不满足其对齐要求的地址的处理器指令。

分段错误发生在访问不属于你的进程的内存时。它们非常常见,通常是以下原因造成的:

使用指向已释放对象的指针。 使用未初始化的伪指针。 使用空指针。 缓冲区溢出。

PS:更准确地说,不是操作指针本身会导致问题。它正在访问它所指向的内存(解引用)。

一个值得注意的原因是,如果您试图mmap用户空间不允许访问的/dev/mem区域,则会返回SIGBUS。

一个我在OS X上编程时遇到的总线错误的具体例子:

#include <string.h>
#include <stdio.h>

int main(void)
{
    char buffer[120];
    fgets(buffer, sizeof buffer, stdin);
    strcat("foo", buffer);
    return 0;
}

如果你不记得,文档strcat通过改变第一个参数将第二个参数附加到第一个参数(翻转参数,它可以正常工作)。在linux上这给出了一个分割错误(正如预期的那样),但在OS X上它给出了一个总线错误。为什么?我真的不知道。