pointeurs - chaine de caractères - realloc - fonctions

Le
idem101010
Bonjour

Je ne comprends pas que ce code après exécution sans erreurs
apparentes lors de la compilation renvoie :
=

Entrez un mot :
test

Test 2 : (null)

=
Le code :

#include <stdio.h>
#include <stdlib.h>

void ReadTxt(char *FTxt) ;

int main(void)
{
char *Pfb2 = 0 ;

printf("Entrez un mot : ") ;
ReadTxt(Pfb2) ;

printf("Test 2 : %s ", Pfb2) ;

free(Pfb2) ;

return 0 ;
}

void ReadTxt(char *FTxt)
{
int c ;
int i ;

i = 0 ;
while ( (c = getchar() ) && c != EOF && c != '' )
{
i++ ;
if ((FTxt = realloc(FTxt, i * sizeof(char))) != NULL)
{
FTxt[i-1] = c ;
FTxt[i] = 0 ;
}
else
{
printf("Erreur allocation") ;
exit(EXIT_FAILURE) ;
}
}
}


Alors que le code suivant fonctionne :

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char *Chaine = 0 ;
int c ;
int i ;

printf("Entrez une phrase : ") ;

i = 0 ;
while ( (c = getchar() ) && c != EOF && c != '' )
{
i++ ;
Chaine = realloc(Chaine, i * sizeof(char) ) ;
Chaine[i-1] = c ;
Chaine[i] = 0 ;
}

printf("Vous avez entre : %s", Chaine) ;
free(Chaine) ;

return 0 ;
}

Merci pour toute aide

Remi
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #22885641
In article idem101010
Bonjour

Je ne comprends pas que ce code après exécution sans erreurs
apparentes lors de la compilation renvoie :



[ pas besoin de plus ]
void ReadTxt(char *FTxt) ;

int main(void)
{
char *Pfb2 = 0 ;

printf("nEntrez un mot : n") ;
ReadTxt(Pfb2) ;

printf("nTest 2 : %s n", Pfb2) ;

free(Pfb2) ;

return 0 ;
}



En C, les parametres sont toujours passes par valeur. Il n'y a pas besoin
de regarder le reste du code, la valeur de Pfb2 ne peut pas changer, ca
sera toujours un pointeur nul.
Benoit Izac
Le #22885661
Bonjour,

le 05/12/2010 à 13:49, idem a écrit dans le message

Je ne comprends pas que ce code après exécution sans erreurs
apparentes lors de la compilation renvoie :
====== >
Entrez un mot :
test

Test 2 : (null)

====== > Le code :

#include #include
void ReadTxt(char *FTxt) ;

int main(void)
{
char *Pfb2 = 0 ;

printf("nEntrez un mot : n") ;
ReadTxt(Pfb2) ;

printf("nTest 2 : %s n", Pfb2) ;

free(Pfb2) ;

return 0 ;
}

void ReadTxt(char *FTxt)



En C, le passage d'argument se fait par copie. Quand tu rentres dans
ReadTxt, FTxt vaut NULL, quand tu en ressorts, il vaut toujours NULL
(quelque soit la valeur que FTxt prend dans la fonction).

Le mieux c'est plutôt de faire « char *ReadTxt(void) » qui renvoie un
pointeur sur la la zone que tu auras allouée et dans laquelle tu auras
copié la saisie soit NULL en cas d'erreur. Ensuite dans main :

Pfb2 = ReadTxt();
if (Pfb2 == NULL) {
/* erreur */
}
printf("nTest 2 : %s n", Pfb2);
free(Pfb2);


i = 0 ;
while ( (c = getchar() ) && c != EOF && c != 'n' )
{
i++ ;
if ((FTxt = realloc(FTxt, i * sizeof(char))) != NULL)



Par définition sizeof char == 1. Lors du premier appel, tu alloues 1, ce
qui n'est pas suffisant pour stocker c et ''. Si realloc échoue, tu
perds l'adresse de la mémoire sur laquelle pointait FTxt avant
l'appelle. Plus moyen de libérer la mémoire.

char *tmp;

tmp = realloc(i + 1);
if (tmp == NULL) {
free(FTxt);
/* mesures à prendre en cas d'erreur */
} else {
FTxt = tmp;
/* on continue le traitement avec FTxt */
}


--
Benoit Izac
Mickaël Wolff
Le #22885781
On 05/12/10 13:18, Marc Espie wrote:
[ pas besoin de plus ]
void ReadTxt(char *FTxt) ;




En C, les parametres sont toujours passes par valeur. Il n'y a pas besoin
de regarder le reste du code, la valeur de Pfb2 ne peut pas changer, ca
sera toujours un pointeur nul.



Benoit a proposé de renvoyer un pointeur sur la nouvelle zone
allouée. Une autre manière de faire est de passer un pointeur sur le
pointeur, et de mettre à jour son contenu dans la fonction appelante :

void ReadTxt(char ** pp_text) ;

Et d'appeler ainsi : ReadTxt(&Pfb2) ;
-ed-
Le #22888941
On 5 déc, 13:49, idem101010

void ReadTxt(char *FTxt)
{
        int c ;
        int i ;

        i = 0 ;
        while ( (c = getchar() )  &&  c != EOF  &&  c != 'n' )
        {
                i++ ;
                if ((FTxt = realloc(FTxt, i * sizeof(char))) != NULL)
                {
                        FTxt[i-1] = c ;
                        FTxt[i] = 0 ;
                }
                else
                {
                        printf("nErreur allocationn") ;
                        exit(EXIT_FAILURE) ;
                }
        }

}




Erreur classique

http://www.bien-programmer.fr/notes.php#fonction_modifie_variable
Publicité
Poster une réponse
Anonyme