Où est l'abbhération informatique sur ces ***** de pointeurs
MasterShadows
Messages postés268Date d'inscriptionlundi 1 mars 2004StatutMembreDernière intervention19 avril 2012
-
6 févr. 2006 à 20:27
cs_louis14
Messages postés793Date d'inscriptionmardi 8 juillet 2003StatutMembreDernière intervention10 février 2021
-
7 févr. 2006 à 10:02
Salut à tous et à toutes,
Je ne sais pas comment j'aurais du nommer le topique mais en fait pouvez vous me dire où est l'abbhération informatique là dedans :
#include <stdio.h>
void CopieChaine(char * pdest, char * psrc)
{
while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
{
*pdest = *psrc; // On met la valeur de psrc dans pdest
*psrc++; // On incremente psrc
*pdest++; // On incremente pdest
}
do
{
// on rentre la chaine
printf("Veuillez rentrer une chaine de caractere :\n");
gets(source);
printf("%s\n", source);
CopieChaine(destination, source);
// on affiche la source et la destination
printf("Chaine source = %s", source);
printf("\nChaine destination = %s\n", destination);
printf("'q' pour quitter\n");
scanf("%c", &indic);
}while(indic != 'q');
return 0;
}
Mon prof prétend que ce qui est écrit en rouge ne devrait théoriquement pas marché, car il nous a dit que *chose renvoie en fait une adresse donc dans cet exemple eh ben , je devrais l'avoir dans l'os, mais si vous compilez ce programme, miracle, il marche à merveille... et si je remplace *pdest++ et *psrc++ par pdest++ par psrc++, mon programme ne fonctionne plus
Pouvez vous m'expliquer en détail ces quelques lignes. Merci...
cs_bouba
Messages postés518Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 novembre 20073 6 févr. 2006 à 21:02
Y'a aucun problème au niveau de la compilation à mon avis. Par contre c'est stupide de faire
*psrc++; // On incremente psrc
*pdest++; // On incremente pdest
Ce que l'on veut ici c'est une copie de chaîne
donc
psrc++;
pdest++;
Sinon, c'est balot, le programme ne plante pas mais aucune copie n'est faite, seule la valeure '\0'-1 sera copiée dans *pdest, les pointeurs ne serait pas incrémentée, pour sortir de la boucle il faudrait attendre que psrc[0] vale '\0'.
Puis la condition
if(*psrc == '\0')
est inutile puisque l'on sorte du while avec pour valeur de *psrc 0. Mettre directement
pdest[*psrc] = '\0';
MasterShadows
Messages postés268Date d'inscriptionlundi 1 mars 2004StatutMembreDernière intervention19 avril 201211 6 févr. 2006 à 21:14
Y'a 3 topics parce mon pc a planté.
Mon programme fonctionne car quand j'écris coucou, il me renvoyé bien en sortie coucou.
En fait, on pouvait remplacer ça :
while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
{
*pdest = *psrc; // On met la valeur de psrc dans pdest
*psrc++; // On incremente psrc
*pdest++; // On incremente pdest
}
par ça :
while(*psrc) // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
{
*pdest = *psrc; // On met la valeur de psrc dans pdest
psrc++; // On incremente psrc
pdest++; // On incremente pdest
}
cs_louis14
Messages postés793Date d'inscriptionmardi 8 juillet 2003StatutMembreDernière intervention10 février 20218 7 févr. 2006 à 10:02
ce qui m'étonne le plus dans ce code , c'est qu'il n'y a pas de réservation de mémoire pour la destination. déjà à la déclaration
char* destination = 0;
en rentrant dans la fonction :
-si destination est différent de 0 on désalloue la mémoire et on refait une allocation de la taille de source. puis on recopie.