Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1734 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°108039
belgique
Posté le 05-03-2002 à 22:23:21  profilanswer
 

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

mood
Publicité
Posté le 05-03-2002 à 22:23:21  profilanswer
 

n°108046
Jar Jar
Intaigriste
Posté le 05-03-2002 à 22:38:03  profilanswer
 

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

n°108047
belgique
Posté le 05-03-2002 à 22:41:59  profilanswer
 

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?

n°108049
Jar Jar
Intaigriste
Posté le 05-03-2002 à 22:53:30  profilanswer
 

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.

n°108051
wpk
Posté le 05-03-2002 à 23:02:29  profilanswer
 

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.

n°108054
Jar Jar
Intaigriste
Posté le 05-03-2002 à 23:05:46  profilanswer
 

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

n°108055
wpk
Posté le 05-03-2002 à 23:09:46  profilanswer
 

int fect(char *user, int size);
 
ou bien ds un esprit plus "objet"
 
typedef struct
{
  char * user;
  int size;
} UserString;
 
int fect(UserString * user);
 
...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
[C++] Petit problème de compilateur.FLEX petit probleme
[Javascript / Apache] petit probleme -> error : exec format errorPitit probleme avec bison ...
help me please !!!!petit probleme html !!!! code inside[make/gcc] problème de compilation
[c++] Probleme avec les classes...Problème avec HTACCESS
[Java] Problème éxecution jarvisual studio .NET architect, probleme d'install
Plus de sujets relatifs à : C Problème de passage par référence


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR