Y n’est pas incrémenté

C’est le programme:

#include void main() { int *x,*y; int a=23,b=56; x=&a; y=&b; printf("%d\t%d",x,y); x++; y++; /* here only x is incremented but y remains same. What is the reason? */ printf("\n%d\t%d",x,y); } 

c’est-à-dire que x est incrémenté de 2.Mais y rest tel quel. Comment?

Il n’y a aucune garantie que vos pointeurs aient la même taille que vos entiers, vous ne devriez donc pas utiliser %d comme spécificateur de format.

J’ai rencontré des problèmes similaires lorsque des personnes transmettent de long variables à printf avec un spécificateur pour un int . Parce que le long était plus large que l’ int , il a confondu printf ce qui concerne l’emplacement de la stack.

Vous devriez utiliser %p pour les pointeurs. Ce code pose également de nombreux autres problèmes, du sharepoint vue des normes. Essayez ce qui suit comme sharepoint départ:

 #include  int main (void) { int *x, *y; int a = 23, b = 56; x=&a; y=&b; printf ("%p %p\n", x, y); x++; y++; printf ("%p %p\n", x, y); return 0; } 

Voici une explication possible (grâce au commentaire de Michael Burr):

Disons que votre pointeur est 32 bits et vos entiers sont 16 bits et que vous êtes sur une architecture little-endian (comme Intel).

En outre, supposons que l’adresse de a soit 0x12345678 et que l’adresse de b soit 0x1234567a .

Lorsque vous les transmettez à printf , vous insérez deux valeurs 32 bits dans la stack, mais printf ne lit que deux valeurs 16 bits, car il a été expliqué que, avec les spécificateurs de format %d %d :

  himem -------- / | 0x12 | push | 0x34 | | | 0x56 | \ | 0x78 | -------- / | 0x12 | \ printf reads 0x1234 push | 0x34 | / | | 0x56 | \ printf reads 0x567a \ | 0x7a | / -------- lomem 

Ensuite, lorsque vous incrémentez les deux pointeurs et appelez à nouveau printf , vous obtenez:

  himem -------- / | 0x12 | push | 0x34 | | | 0x56 | \ | 0x7a | -------- / | 0x12 | \ printf reads 0x1234 push | 0x34 | / | | 0x56 | \ printf reads 0x567c \ | 0x7c | / -------- lomem 

Vous pouvez donc voir dans ce scénario pourquoi il semblerait qu’un seul pointeur ait été incrémenté, mais le vrai problème est que vous n’imprimez pas les pointeurs, mais que vous en imprimez la moitié la plus significative (qui a probablement gagné ne change pas) et la moitié la moins significative de ce même (qui changera).

que diriez-vous de … int * x; int * y; au lieu de int * x, * y;

Salut, vous incrémentez votre adresse de pointeur pas la valeur utiliser (*x)++ (*y)++

Dans votre code, vous accédez à un pointeur et l’incrémente. Voici ce que vous pourriez vouloir faire:

 void main() { int *x,*y; int a=23,b=56; x=&a; y=&b; printf("%d\t%d",*x,*y); (*x)++; (*y)++; printf("\n%d\t%d",*x,*y); return 0; } 

Notez que (* x) ++ et (* y) ++ pour accéder à la valeur du pointeur, car vous souhaitez l’incrémenter. Si vous écrivez x ++ ou y ++, vous incrémentez le pointeur lui-même, ce qui signifie que vous insérez l’adresse à l’endroit où il pointe. Cela conduit dans votre cas à des valeurs indéfinies.

vous incrémentez les pointeurs , pas les valeurs si cela peut vous aider.

Je ne peux pas vous en dire plus, car cette source ne comstack pas et vous donne à peu près le même avertissement que moi 🙂

 #include int main(int argc, char *argv[]) { int *x,*y; int a=23,b=56; x=&a; y=&b; printf("%d\t\t%d",*x,*y); x++; y++; printf("\n%d\t\t%d",*x,*y); return 0; } 

qui comstackra et montrera le contenu – sur mon compilateur, ce qui donnera le résultat suivant:

 23 56 1606415920 23 

(Je mets les deux ‘\ t’ par ligne pour garantir la séparation des valeurs, cela n’affecte pas le rest du code)

puisque je suppose que vous voulez que le code incrémente a et b le code serait le suivant:

 #include int main(int argc, char *argv[]) { int *x,*y; int a=23,b=56; x=&a; y=&b; printf("%d\t\t%d",*x,*y); (*x)++; (*y)++; printf("\n%d\t\t%d",*x,*y); return 0; } 

qui imprime:

 23 56 24 57 

S’il vous plaît le programme:

 #include void main() { int *x= NULL; int *y = NULL; int a=23,b=56; x=&a; y=&b; printf("%x\t%x",x,y); x++; y++; printf("\n%x\t%x",x,y); } 

Je crois que cela devrait aller alors. Seules les valeurs sont initialisées correctement.