分段故障与分段故障核心丢弃的区别

时间:2011-10-24 20:16:01

标签: c segmentation-fault coredump

考虑C

中的以下代码
int n;
scanf("%d",n)

它给出了在Linux Mandriva中的GCC编译器中转储的错误Segmentation fault core

但是以下代码

int *p=NULL;
*P=8;

只给出了分段错误,为什么会这样......?

3 个答案:

答案 0 :(得分:4)

核心转储是一个文件,其中包含程序崩溃时状态和内存的转储。由于核心转储可能占用非常少量的磁盘空间,因此可以对其大小进行限制。您可以使用ulimit -c看到它。

现在,当您遇到分段错误时,默认操作是终止进程并转储核心。你的shell告诉发生了什么,如果一个进程终止了一个分段错误信号,它将打印Segmentation fault,如果该进程另外转储了核心(当ulimit设置和目录上的权限时核心转储是生成允许它,它会告诉你。

答案 1 :(得分:1)

假设您在同一系统上运行这两个设备,使用相同的ulimit -c设置(这是我对您所看到的差异的第一次猜测),那么优化器可能会“注意到“第二个例子中明确未定义的行为,并生成自己的退出。您可以查看objdump -x

答案 2 :(得分:0)

在第一种情况下,'n'可以有任何值,你可能拥有这个内存(或不拥有),它可能是可写的(或不是),但它可能存在。没有理由认为n必然为零。

写入NULL绝对是顽皮的,操作系统会注意到这一点!