Retourner *proprement* un type string
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 :
Code:
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);
...
} |
Je retourne l'addresse d'une varialbe locale => pas bien. :aie: 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 :
Code:
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);
...
} |
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") ?
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 :mur: ...
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 :
Code:
1 2 3
|
string str1;
str1 = addstr(str2,str3); |
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) ?
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 !