Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pointeurs - chaine de caractères - realloc - fonctions

4 réponses
Avatar
idem101010
Bonjour

Je ne comprends pas que ce code apr=E8s ex=E9cution sans erreurs
apparentes lors de la compilation renvoie :
=3D=3D=3D=3D=3D=3D=3D

Entrez un mot :
test

Test 2 : (null)

=3D=3D=3D=3D=3D=3D=3D
Le code :

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

void ReadTxt(char *FTxt) ;

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

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

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

free(Pfb2) ;

return 0 ;
}

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

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


Alors que le code suivant fonctionne :

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

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

printf("\n\nEntrez une phrase : \n") ;

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

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

return 0 ;
}

Merci pour toute aide

Remi

4 réponses

Avatar
espie
In article ,
idem101010 wrote:
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.
Avatar
Benoit Izac
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 <stdio.h>
#include <stdlib.h>

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
Avatar
Mickaël Wolff
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) ;
Avatar
-ed-
On 5 déc, 13:49, idem101010 wrote:


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