C++ pointeur

Fermé
xman_genius Messages postés 97 Date d'inscription vendredi 14 octobre 2005 Statut Membre Dernière intervention 21 novembre 2006 - 6 janv. 2006 à 11:48
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 6 janv. 2006 à 23:22
/*
ce petit programme sert a inverser une liste de nombre.
il n'y a pas de probleme de syntaxe, mais au cours de
l'execution un bug survient comme quoi la memoire ne
peut pas etre li apres l'excution de la premiere boucle.
merci d'avance de m'indiquer la source du porbleme*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int *p,*q,i,j;
for(i=0;i<10;i++)
scanf("%d\n",&p+i);
i=9,j=0;
do{
*(q+j)=*(p+i);
i--;
j++;
}while(i<=0 && 9<j);
for(i=0;i<10;i++)
printf("%d\n",*(q+i));
system("pause");
return 0;

}

3 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
6 janv. 2006 à 15:35
*p et *q c'est des pointeurs, pas des tableaux, donc forcément si tu fais des *(q+j)=*(p+i);
Tu accédes à des zones memoires imprevues.

Et ici:
scanf("%d\n",&p+i); 

p c'est déjà une adresse. Donc &p c'est l'adresse de p (l'adresse d'un pointeur). Donc &p + i c'est quelque part ou personne ne veut aller sinon un voyageur en quête d'aventure....

Sans compter que p et q doivent pointer vers des variables existantes ou bien vers un espace qui doit être alloué.
0
xman_genius Messages postés 97 Date d'inscription vendredi 14 octobre 2005 Statut Membre Dernière intervention 21 novembre 2006 21
6 janv. 2006 à 21:28
pour *(q+j)=*(p+i); *(q+j) et *(p+i) sont des contenus de memoire et pas des @memoire
alors que pour scanf("%d\n",&p+i); on peut le faire ca marche mais le compilateur ce plante a l'affectation donc au 2eme boucle
merci de ton aide ;)
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
6 janv. 2006 à 23:22
Si tu déclare un pointeur
int *q;

Tu ne pas juste après faire par exemple
*q=1;

Car q ne pointe sur rien pour l'instant. Tu peux le faire pointer vers une variable existante ou vers un espace memoire alloué.

*(q+j)=*(p+i); je suis d'accord ce sont des contenus memoires (enfin ça l'aurait été si q et p pointaient vers quelquechose de concret). Mais pour l'instant ils ne pointent sur rien.

q ne pointe sur rien. Donc q+9 ne pointe pas non plus dans un espace memoire valide (ou du moins pas celui que tu aurais voulu).
0