2014-06-06 6 views
0

J'ai 3 exemples d'applets pour décrire ma confusion ici.Étrange performance 'SIGSEGV' à propos de la fonction signal()

D'abord, un programme de défaut de segmentation classique est comme ceci:

#include <stdio.h> 
main() 
{  
    int *p=NULL; 
    *p=0; //here will cause a SIGSEGV signal 
} 

Quand je lance l'applet ci-dessus, le terminal montrera

# ./a.out 
Segmentation fault 

Ensuite, ajouter une fonction signal() dans l'applet, alors il ressemblera à ceci:

#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; 
} 

Quand je lance l'applet ci-dessus, le terminal affichera

# ./a.out 
It's SIGSEGV! 

Enfin, je supprime la chaîne NULL dans l'applet, il fonctionnera SUCCES !!:

#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; 
} 

Le résultat est

# ./a.out 
The value of p is 0 

Pourquoi?

Répondre

4

Le déréférencement de pointeur non initié est un comportement indéfini. Tout peut arriver. Le programme est cassé, et vous ne pouvez pas le raisonner.

Questions connexes