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!
Et une estimation est vraiment tout ce que vous pouvez faire ici, ce n'est pas défini et tout. – Donnie
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
@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 ... –