2017-08-24 2 views
-1

La version 1 indique une erreur de segmentation, mais lorsque je lance la version 2, cela fonctionne correctement.Erreur de segmentation lors du renvoi direct de l'adresse mais pas d'erreur lors de son renvoi via le pointeur

Pourquoi?

main() 
{ 
    int *p; 
    p=fun(); 
    print p; 
    print *p 
} 

//version 1 gives segmentation fault 
int *fun() 
{ 
    int i=20; 
    return &i 
} 

//version 2 runs fine 
int *fun() 
{ 
    int i=20; 
    int *ptr=&i; 
    return ptr; 
} 
+1

De quelle langue s'agit-il? Qu'est-ce que 'print'? Tel qu'il est écrit, il n'est clairement pas C, bien qu'il y ressemble. –

+0

vous ne devez pas renvoyer de pointeurs aux variables locales. Il en résulte UB – pm100

+0

Note: L'étiquette 'C' a été ajoutée par quelqu'un d'autre que l'affiche originale. –

Répondre

0

Ce que vous faites est considéré comme un comportement indéfini. Lorsque vous appelez un fun, le numéro 20 est écrit sur la pile. Lorsque vous quittez fun(), le pointeur de pile est décrémenté. Maintenant, vous appelez le print(), qui mettra probablement ses propres variables sur la pile, et écrasera probablement tout ce que vous y avez écrit.

Fondamentalement, vos deux exemples sont mauvais code, et peut entraîner des comportements différents en fonction de l'architecture que vous utilisez, l'adresse de la charge, la phase de la lune, etc.

1

chance? Les deux sont incorrects car ils renvoient des pointeurs sur les données de la pile qui ne sont plus dans la portée.