2012-12-29 2 views
1

Ce serait deux questions dans unC++ pointeurs erreur de segmentation de sortie de l'ordre de déclaration ou bus erreur

J'ai deux morceaux de codes, la seule différence étant l'ordre entre la déclaration d'int * a; et int cpt = 0; sur les lignes 6 et 7.

Cas 1:

#include <iostream> 
using namespace std; 
int main() 
{ 
    cout<<"begin"<<endl; 
    int* a; 
    int cpt = 0; 
    cout<<"after init "<<a<<endl; 
    *a = 2; 
    cout<<"after assign"<<endl; 
    cout<<a<<" "<<*a<<endl; 
    cout<<"after cout"<<endl; 
    int* b; 
    *b = 2; 
    cout<<b<<" "<<*b<<endl; 
} 

sortie:

begin 
after init 0x7fff6c97f05e 
Bus error: 10 

Cas 2:

#include <iostream> 
using namespace std; 
int main() 
{ 
    cout<<"begin"<<endl; 
    int cpt = 0; 
    int* a; 
    cout<<"after init "<<a<<endl; 
    *a = 2; 
    cout<<"after assign"<<endl; 
    cout<<a<<" "<<*a<<endl; 
    cout<<"after cout"<<endl; 
    int* b; 
    *b = 2; 
    cout<<b<<" "<<*b<<endl; 
} 

Sortie:

begin 
after init 0x7fff50e4ac00 
after assign 
0x7fff50e4ac00 2 
after cout 
Segmentation fault: 11 

Je me demande pourquoi l'ordre de déclaration affecte l'erreur. La variable cpt n'est utilisée nulle part, alors pourquoi sa déclaration affecterait-elle l'erreur?

Je me demande aussi pourquoi le pointeur "a" dans le second cas ne produit pas de segfault lors de la référence quand le pointeur "b" produit un défaut de segmentation. Ils ont la même déclaration et le même usage, pourquoi la différence?

Merci!

Répondre

6

La clé est ce que vous faites (déréférencement un pointeur non initialisé) se traduit par un comportement non défini , donc vous ne pouvez vraiment pas attendre quoi que ce soit notamment pour arriver, ni est-il un raisonnable/"standard conforme "explication de ce que le programme fait. Il peut toutefois arriver que la pile soit configurée de telle sorte que, dans le second cas, a pointe par inadvertance vers un emplacement de mémoire valide, mais ce n'est qu'une supposition.

+0

Et une estimation est vraiment tout ce que vous pouvez faire ici, ce n'est pas défini et tout. – Donnie

+0

Je suis d'accord avec cela, le problème est que l'accident se répète encore et encore lors de l'exécution du même code. Un accident qui est constant comme ça semble être la norme non? Le pointeur "a" est toujours initialisé et ne produit pas de segfault alors que le pointeur "b" produit toujours un défaut de segmentation. – Sam

+0

@Sam Non, c'est juste votre système d'exploitation qui réutilise la même région de mémoire/modèle d'allocation pour votre processus ... –

Questions connexes