考虑C
中的以下代码int n;
scanf("%d",n)
它给出了在Linux Mandriva中的GCC编译器中转储的错误Segmentation fault core
但是以下代码
int *p=NULL;
*P=8;
只给出了分段错误,为什么会这样......?
答案 0 :(得分:4)
核心转储是一个文件,其中包含程序崩溃时状态和内存的转储。由于核心转储可能占用非常少量的磁盘空间,因此可以对其大小进行限制。您可以使用ulimit -c
看到它。
现在,当您遇到分段错误时,默认操作是终止进程并转储核心。你的shell告诉发生了什么,如果一个进程终止了一个分段错误信号,它将打印Segmentation fault
,如果该进程另外转储了核心(当ulimit
设置和目录上的权限时核心转储是生成允许它,它会告诉你。
答案 1 :(得分:1)
假设您在同一系统上运行这两个设备,使用相同的ulimit -c
设置(这是我对您所看到的差异的第一次猜测),那么优化器可能会“注意到“第二个例子中明确未定义的行为,并生成自己的退出。您可以查看objdump -x
。
答案 2 :(得分:0)
在第一种情况下,'n'可以有任何值,你可能拥有这个内存(或不拥有),它可能是可写的(或不是),但它可能存在。没有理由认为n必然为零。
写入NULL绝对是顽皮的,操作系统会注意到这一点!