我有3个示例小程序来描述我的困惑。
首先,经典的分段错误程序是这样的:
#include <stdio.h>
main()
{
int *p=NULL;
*p=0; //here will cause a SIGSEGV signal
}
当我运行上面的小程序时,终端将显示
# ./a.out
Segmentation fault
接下来,我在applet中添加了一个signal()函数,然后它将如下所示:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
void handler(int s)
{
if(s==SIGSEGV)
printf("It's SIGSEGV!\n");
exit(1);
}
main()
{
int *p=NULL;
signal(SIGSEGV,handler);
*p=0;
return 0;
}
当我运行上面的小程序时,终端将显示
# ./a.out
It's SIGSEGV!
最后,我删除了applet中的NULL字符串,它将运行SUCCESSFULLY !!:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
void handler(int s)
{
if(s==SIGSEGV)
printf("It's SIGSEGV!\n");
exit(1);
}
main()
{
int *p; //There is no more 'NULL' here
signal(SIGSEGV,handler);
*p=0;
printf("The value of p is %d\n",*p);
return 0;
}
结果是
# ./a.out
The value of p is 0
为什么?
答案 0 :(得分:4)
取消引用未经初始化的指针是未定义的行为。任何事情都可能发生。程序被破坏了,你不能用它来推理。