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
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

Poser une question


[ pas besoin de plus ]
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.
le 05/12/2010 à 13:49, idem a écrit dans le message
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);
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
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) ;
Erreur classique
http://www.bien-programmer.fr/notes...e_variable