“总线错误”消息是什么意思,它与分段错误有什么不同?
当前回答
总线错误现在在x86上很少见,发生在你的处理器甚至不能尝试请求的内存访问时,通常是:
使用具有不满足其对齐要求的地址的处理器指令。
分段错误发生在访问不属于你的进程的内存时。它们非常常见,通常是以下原因造成的:
使用指向已释放对象的指针。 使用未初始化的伪指针。 使用空指针。 缓冲区溢出。
PS:更准确地说,不是操作指针本身会导致问题。它正在访问它所指向的内存(解引用)。
其他回答
我在Mac OS X上出现总线错误的原因是我试图在堆栈上分配大约1Mb的内存。这在一个线程中工作得很好,但是当使用openMP时,这会驱动总线错误,因为Mac OS X对于非主线线程有非常有限的堆栈大小。
这取决于你的操作系统、CPU、编译器以及其他因素。
一般来说,这意味着CPU总线无法完成命令或发生冲突,但这可能意味着一系列事情,具体取决于正在运行的环境和代码。
一个值得注意的原因是,如果您试图mmap用户空间不允许访问的/dev/mem区域,则会返回SIGBUS。
总线错误的一个典型实例是在某些体系结构上,例如SPARC(至少在某些SPARC上,可能已经更改了),即当您执行不一致的访问时。例如:
unsigned char data[6];
(unsigned int *) (data + 2) = 0xdeadf00d;
这段代码尝试将32位整型值0xdeadf00d写入(很可能)没有正确对齐的地址,并将在“挑剔”的体系结构上生成总线错误。顺便说一下,Intel x86并不是这样的架构。它将允许访问(尽管执行速度较慢)。
我试图释放一个不小心在堆栈上的字符串:
#include <stdlib.h>
int main(void)
{
char *str = "foo";
free(str);
return (EXIT_SUCCESS);
}
我的修复是strdup()堆栈上的字符串:
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *str = strdup("foo");
free(str);
return (EXIT_SUCCESS);
}