C Problème de passage par référence - Programmation
Marsh Posté le 05-03-2002 à 22:38:03
Ouh là, t'as du mal avec les pointeurs, toi... Ta fonction fect n'a modifié à aucun moment ce qui est pointé par user, car tu commences par affecter une nouvelle valeur à ce pointeur.
Un truc mieux :
Code :
|
Tu peux aussi remplacer le malloc et le snprintf par un appel à asprintf(&user,"%s","TEST" ); qui fait l'allocation tout seul, sans limite de taille (c'est mieux).
Marsh Posté le 05-03-2002 à 22:41:59
je veux pas renvoyer de char. je veux passer un vecteur de char par ref. Merci pour la réponse. pas d'autres idées?
Marsh Posté le 05-03-2002 à 22:53:30
Tu peux faire comme ça, mais c'est MAL(tm) de modifier des char * dans une procédure.
Code :
|
Tu comprends ton erreur ? Si tu affectes une valeur à user (ie si tu écris user=quelquechose), tu modifies le pointeur, pas ce vers quoi il pointe.
Marsh Posté le 05-03-2002 à 23:02:29
Jar Jar a écrit a écrit : Tu peux faire comme ça, mais c'est MAL(tm) de modifier des char * dans une procédure.
|
je dirais plutot que renvoyer un char * alloué ds la fct fect c'est MAL. Y'a rien de mieux pour creer des belles fuites de memoire ou des core à repetition. Pour moi, l'entité qui fait l'allocation, fait egalement la desallocation. Ici, c'est plutot au main d'allouer & desalouer.
Marsh Posté le 05-03-2002 à 23:05:46
wpk a écrit a écrit : je dirais plutot que renvoyer un char * alloué ds la fct fect c'est MAL. Y'a rien de mieux pour creer des belles fuites de memoire ou des core à repetition. Pour moi, l'entité qui fait l'allocation, fait egalement la desallocation. Ici, c'est plutot au main d'allouer & desalouer. |
Je ne suis pas d'accord. Si tu renvoies un char * alloué, il suffit de le spécifier, et ça se libère à chaque fois. Par contre, si tu l'alloues avant, tu ne peux pas connaître la longueur de la chaîne avant de l'allouer. Conséquences : utilisation inutile de mémoire, limitation arbitraire de la longueur des chaînes, et risques de débordement de buffer. Entre un risque de fuites de mémoire et un risque de débordement, je n'hésite pas longtemps...
Marsh Posté le 05-03-2002 à 23:09:46
int fect(char *user, int size);
ou bien ds un esprit plus "objet"
typedef struct
{
char * user;
int size;
} UserString;
int fect(UserString * user);
...
Marsh Posté le 05-03-2002 à 22:23:21
Voilà un code très simple mais qui ne merche pas correctement.
Le printf de la fonction fect affiche bien test mais celui du main non. PQ?.... Je désespère.
int fect(char *user);
int main()
{
char *user;
c=fect(user);
printf(user);
return 0;
}
int fect(char *user)
{
user=(char*)malloc(sizeof(char)*20);
user="TEST";
printf(user);
return 0;
}