C Problème de passage par référence

C Problème de passage par référence - Programmation

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

Reply

Marsh Posté le 05-03-2002 à 22:23:21   

Reply

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 :
  1. char *fect();
  2. int main(int argc, char **argv)
  3. {
  4. char *user;
  5. user=fect();
  6. printf(user);
  7. free(user); /* Ne JAMAIS oublier les free !!!!! */
  8. return 0;
  9. }
  10. char *fect()
  11. {
  12. char *user;
  13. user = malloc(20);
  14. snprintf(user,20,"%s",TEST" );
  15. return user;
  16. }


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

Reply

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?

Reply

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 :
  1. int fect(char *user);
  2. int main(int argc, char **argv)
  3. {
  4. int c;
  5. char *user;
  6. user=malloc(20);
  7. c=fect(user);
  8. printf(user);
  9. free(user);
  10. return 0;
  11. }
  12. int fect(char *user)
  13. {
  14. snprintf(user,20,"%s","TEST" );
  15. printf(user);
  16. return 0;
  17. }


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.

Reply

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.
 

Code :
  1. int fect(char *user);
  2. int main(int argc, char **argv)
  3. {
  4. int c;
  5. char *user;
  6. user=malloc(20);
  7. c=fect(user);
  8. printf(user);
  9. free(user);
  10. return 0;
  11. }
  12. int fect(char *user)
  13. {
  14. snprintf(user,20,"%s","TEST" );
  15. printf(user);
  16. return 0;
  17. }


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.  




 
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.

Reply

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

Reply

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);
 
...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed