“总线错误”消息是什么意思,它与分段错误有什么不同?
当前回答
段错误是访问不允许访问的内存。它是只读的,你没有权限等等。
总线错误试图访问不可能存在的内存。您使用了一个对系统没有意义的地址,或者该操作的地址类型是错误的。
其他回答
导致总线错误的典型缓冲区溢出是:
{
char buf[255];
sprintf(buf,"%s:%s\n", ifname, message);
}
在这里,如果双引号("")中的字符串的大小大于buf大小,则会给出总线错误。
它通常表示未对齐的访问。
试图访问物理上不存在的内存也会产生总线错误,但如果您使用的是带有MMU的处理器和没有bug的操作系统,则不会看到这个错误,因为您不会将任何不存在的内存映射到进程的地址空间。
我试图释放一个不小心在堆栈上的字符串:
#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);
}
在POSIX系统上,当代码页由于某种原因无法换入时,还可以获得SIGBUS信号。
段错误是访问不允许访问的内存。它是只读的,你没有权限等等。
总线错误试图访问不可能存在的内存。您使用了一个对系统没有意义的地址,或者该操作的地址类型是错误的。