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 : 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);
   ...
}
Je retourne l'addresse d'une varialbe locale => pas bien. 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 : 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);
   ...
}
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 ...


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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 !