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

 


Dernière réponse
Sujet : C Problème de passage par référence
wpk int fect(char *user, int size);
 
ou bien ds un esprit plus "objet"
 
typedef struct
{
  char * user;
  int size;
} UserString;
 
int fect(UserString * user);
 
...

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
wpk int fect(char *user, int size);
 
ou bien ds un esprit plus "objet"
 
typedef struct
{
  char * user;
  int size;
} UserString;
 
int fect(UserString * user);
 
...
Jar Jar

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

wpk

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.

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

belgique 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?
Jar Jar 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).

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

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)