0
votes

Pourquoi un pointeur donne-t-il une ordure / une valeur aléatoire lors de l'initialisation et de la désémartance après la déclaration?

code snippet-1 xxx

code SNIPPET-2 xxx

Snippet-1 donne la sortie x = 3 & p = 3, mais snippet-2 donne x = 3 & p = une valeur aléatoire

< / p>


5 commentaires

Dans le deuxième extrait, * p = & x; Si cela ne crie pas un avertissement, vous devez élever vos avertissements à des niveaux renforcés et les traiter comme des erreurs parce que c'est exactement ce qu'ils sont. Affectation int * à int est toutes sortes de mal.


@LUNDIN Je ne sais pas ce que vous entendez par "Valide C", mais Snippet-1 compile proprement sur un compilateur GCC, en donnant la sortie attendue.


@AYUSHNANGLIA Compile parfaitement signifie aucun avertissement. Valide C signifie qu'il suit la norme C réelle. Le GCC avec paramètres par défaut ne donne pas d'erreurs pour les violations du langage C, uniquement des avertissements. Lisez ceci: Stackoverflow.com/questions/52186834/...


Parler clairement, Lundin et Craig ont raison. * p = & x; est définitivement faux et non valide c dès que p n'est pas un pointeur sur le pointeur (ce qui n'est pas le cas dans votre exemple). Raison Pourquoi est expliqué en détail dans les réponses à votre question. BTW, ils parlent d'un snippet 2, pas d'extraits 1.


J'admets, * p = & x; Est faux et le compilateur donne un avertissement pour cela, mais il exécute int * p = & x; sans aucun avertissement (s). C'est tout ce que je voulais clarifier


4 Réponses :


2
votes

Cet extrait de code a un comportement indéfini xxx

car le pointeur p n'a pas été initialisé et a une valeur indéterminée qui ne pointe pas sur un objet valide. Donc, cette déclaration xxx

par la déséroférance du pointeur ( * p ) tente d'accéder à la mémoire à une adresse invalide.

Il semble que cette déclaration xxx

vous voulez dire xxx

c'est le pointeur obtient l'adresse de la variable < Code> X .

Faites attention à ce que le message sorti de cet appel d'un tel appel de PrintF xxx

est déroutant. Il serait préférable d'écrire xxx

ce n'est pas la valeur du pointeur lui-même émise mais la valeur de l'objet pointué émettant.

Vous devez distinguer le sens de l'astérisque dans une déclaration et dans une expression.

dans une déclaration comme celle-ci xxx

L'astérisque signifie que Ici est déclaré un pointeur et obtient l'adresse de la variable x.

dans une déclaration d'expression comme celle-ci xxx

L'astérisque indique l'opérateur de la désérogression qui est utilisé pour accéder à l'objet pointu au moyen de la valeur stockée dans le pointeur utilisé comme adresse.


1 commentaires

Le «P» utilisé dans l'impression a été utilisé comme une variable aléatoire afin de le distinguer de «X», cela n'indique pas vraiment à un pointeur, bien que j'ai eu votre point.



1
votes

int * p = & x; code> est équivalent à xxx pré>

p = & x code> prend l'adresse de la variable x et des places il dans p code> (qui est un pointeur). p>

qui est différent de fort> ce que vous faites dans snippet-2 p>

*p = &x; // Not the same


0 commentaires

4
votes

Cette ligne: xxx pré>

est une déclaration em> de p code> avec l'initialisation. Il initialise p code>, qui est un int * code>, sur & x code>. P>

en contraste, cette ligne: p >

*p=&x;


0 commentaires

1
votes
int x;
int *p;

x = 3;
p = &x;            // No * operator here.

printf("x = %d\n", x);
printf("*p = %d\n", *p);

0 commentaires