[C] Modification indésirable d'un pointeur

Fermé
Tanynep Messages postés 2 Date d'inscription lundi 21 décembre 2009 Statut Membre Dernière intervention 21 décembre 2009 - 21 déc. 2009 à 13:04
Tanynep Messages postés 2 Date d'inscription lundi 21 décembre 2009 Statut Membre Dernière intervention 21 décembre 2009 - 21 déc. 2009 à 14:02
Bonjour,
dans un petit programme en C, j'avais un problème avec la fonction fgets donc j'ai voulu la réécrire... mais là n'est pas la question. Le prototype de ma fonction est le suivant :
void fgets_perso(char* lu, int n_max, FILE* f);

lu est un pointeur sur la chaîne lue dans le fichier. Les seules opérations effectuées sur lu sont une initialisation à '\0' et une concaténation (strcat) avec les caractères lus un à un. Pourtant, quand je sors de ma fonction, la valeur du pointeur "lu" a été modifiée, et pas seulement la valeur des données sur lesquelles il pointe ! Ça me paraît absolument aberrant car il me semble qu'il aurait fallu un pointeur sur pointeur pour pouvoir modifier cette valeur.

Est-ce que vous auriez une idée de l'origine du problème ? Merci beaucoup d'avance,

Tanynep

P.S. : voici le code complet de ma fonction :

void fgets_perso(char* lu, int n_max, FILE* f)
{
char c[1]; //chaîne à un seul caractère pour utiliser la fonction strcat
int i = 0;
c[1] = '\0';
*lu = '\0'; //initialisation de la chaîne

*c = fgetc(f);
while((*c != EOF) && (*c != '\n') && (i < n_max)) //on s'arrête à la fin de la ligne ou du fichier ou quand le nombre max de caractères a été lu
{
strcat(lu, c);
i++;
*c = fgetc(f);
}

if((*c == '\n') && (i < n_max)) //si on est sorti à cause d'une fin de ligne, on ajoute le caractère '\n'
{
strcat(lu, "\n");
}
}
A voir également:

2 réponses

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
21 déc. 2009 à 13:33
char c[1];
c[1] = '\0';

Après ces deux lignes, on est au moins sûr d'une chose; sans pourvoir prédire lequel, on est certain qu'il y aura un comportement anormal.
Tu dis que le tableau 'c' contient 1 caractère et tu écris un 'zéro' dans le deuxième ! Il te faut donc dire que le tableau contient 2 caractères dont l'indice utilisable pourra aller de '0' à '1'.
NB: Je n'ai pas lu tout ton code non indenté... il y a peut-être d'autres erreurs ;-)
Bonne continuation.
0
Tanynep Messages postés 2 Date d'inscription lundi 21 décembre 2009 Statut Membre Dernière intervention 21 décembre 2009
21 déc. 2009 à 14:02
Merci pour ta réponse, c'était bien ça qui plantait ! Je pensais que le compilateur allouait un octet de mémoire en plus pour le caractère de fin de chaîne, mais je confondais avec une déclaration du genre : char chaine = "hello world" ...
0