“总线错误”消息是什么意思,它与分段错误有什么不同?
当前回答
我试图释放一个不小心在堆栈上的字符串:
#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信号。
这取决于你的操作系统、CPU、编译器以及其他因素。
一般来说,这意味着CPU总线无法完成命令或发生冲突,但这可能意味着一系列事情,具体取决于正在运行的环境和代码。
我在Mac OS X上出现总线错误的原因是我试图在堆栈上分配大约1Mb的内存。这在一个线程中工作得很好,但是当使用openMP时,这会驱动总线错误,因为Mac OS X对于非主线线程有非常有限的堆栈大小。
我相信内核会引发SIGBUS 当应用程序显示数据时 数据总线上的不对中。我认为 那是因为大多数[?现代编译器 对于大多数处理器,垫/对齐 为程序员提供的数据 以前的对准问题(至少) 减轻,因此一个人看不见 这些天SIGBUS太频繁(AFAIK)。
来自:这里
一个我在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上它给出了一个总线错误。为什么?我真的不知道。
推荐文章
- 如何生成一个核心转储在Linux上的分段错误?
- 在Python中如何在Linux和Windows中使用“/”(目录分隔符)?
- 使用sh shell比较字符串
- 为什么函数指针定义可以使用任意数量的&号或星号* ?
- 什么是可重入函数?
- 如何在C中将数组初始化为0 ?
- Typedef定长数组
- 只列出UNIX中的目录
- 在C语言中通过引用传递
- sizeof(某个指针)总是等于4吗?
- 为什么星号在变量名之前,而不是在类型之后?
- 如何限制从grep返回的结果的数量?
- 何时使用内联函数,何时不使用它?
- 如何管道列表的文件返回的找到命令到猫查看所有文件
- 以相对于当前目录的路径递归地在Linux CLI中列出文件