Bonjour à tous, après avoir passé de nombreuses heures à "googler" sur la question, je n'ai pas eu de réponse satisfaisante, je vais donc avoir besoin d'aide...
D'abord, en C, y-a-t-il un moyen propre de retourner un char *, dans le but d'obtenir une nouvelle chaine ?
1er exemple :
Je retourne l'addresse d'une varialbe locale => pas bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 char * addch (char * ch1, char * ch2) { char buf[256] ; buf[0]='\0'; strcat(buf,ch1); strcat(buf,ch2); return buf; } void main () { Char ptr[256], ch1[256], ch2[256]; strcpy(ch1,"Hello "); strcpy(ch2,"World !"); ptr = addch(ch1,ch2); ... }Même avec un strcpy en sortie, on est pas à l'abri de voir la zone mémoire de buf écrasée lors de l'appel à strcpy (si on a pas de chance)...
(Ce que je viens de dire est-il correct ?)
2eme exemple :
Là, il me semble que c'est mieux, sauf qu'en retour de fonction, comme ptr prennant la nouvelle valeur avait déja une allocation, celle-ci est donc "perdue" (cause de "memory leak") ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 char * addch (char * ch1, char * ch2) { char * buf; // je ne me souvient plus de la syntaxe exacte pour : <memalloc : allocation de mémoire pour buf> buf[0]='\0'; strcpy(buf,ch1); strcat(buf,ch2); return buf; } void main () { Char ptr[256], ch1[256], ch2[256]; strcpy(ch1,"Hello "); strcpy(ch2,"World !"); ptr = addch(ch1,ch2); ... }
faut-il désallouer ptr avant l'appelle à la fonction ?
Cette solution me semble lourde et peu pratique à appliquer, autant passer ptr comme paramètre supplémentaire (?), sauf qu'il est alors inutile de retourner une valeur, puisqu'on peux directement affecter la nouvelle chaine à ptr...
En C++ maintenant, avec la classe STL string, que se passe-t-il si je retourne une variable locale de type string dans l'exemple suivant :
Est ce que l'affectation de str1 avec l'opérateur = est une simple affectation de pointeur, ou est-ce que la chaine est recopiée à l'addresse adéquate dans la structure String ? Et même dans ce dernier cas, ne risquons nous pas de voir la chaine écrasée avant d'avoir été recopiée (comme dans le cas précédent en C) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 string str1; str1 = addstr(str2,str3);
Etant donné que le problème semble "basic" et que je n'ai trouvé aucune réponse dans les forums/faqs, je dois avoir mal compris certains concepts en C/C++ concernant les appels aux fonctions / l'allocation mémoire / la gestion des pointeurs...
Merci de votre aide !
Partager