Passage de tableau de pointeur par reference
Bonjour a tous pour mon premier post sur le forum C.
Je me suis mis au C y'a tres peu de temps, et j'avoue que je galere avec les passages d'arguments par reference.
J'ai fait une fonction toute simple qui decoupe une chaine de longueur indefinie en un tableau, et qui renvoie ce tableau, ainsi que sa longueur.
J'arrive a renvoyer le tableau de pointeurs, mais pas a le renvoyer par reference:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
int strarr(char *string, char *sep, char ***strarray)
{
int nbElem = 0;
char *token = NULL, *saveptr = NULL, *copy = strdup(string);
for (token = strtok_r(copy, sep, &saveptr); token != NULL; token = strtok_r(NULL, sep, &saveptr))
{
char **success = NULL;
if ((success = (char **)realloc(*strarray, (nbElem + 1) * sizeof(char *))) == NULL)
return -1;
*strarray = success;
*strarray[nbElem++] = strdup(token);
}
free(copy);
return nbElem;
} |
Le code de l'appellant est le suivant:
Code:
1 2 3 4 5 6
|
char **strarray = NULL;
int nbValues = strarr("/abc/def/ghi/klmn", "/", &strarray);
int i = 0;
for (i = 0; i < nbValues; i++)
printf("%s\n", strarray[i]); |
[/CODE]
Mon code fonctionne correctement si je renvoie le pointeur par return, mais bon, ce n'est pas ce que je veux:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
char **strarr(char *string, char *sep)
{
int nbElem = 0;
char *token = NULL, *saveptr = NULL, *copy = strdup(string);
char **strarray = NULL;
for (token = strtok_r(copy, sep, &saveptr); token != NULL; token = strtok_r(NULL, sep, &saveptr))
{
char **success = NULL;
if ((success = (char **)realloc(strarray, (nbElem + 1) * sizeof(char *))) == NULL)
return -1;
strarray = success;
strarray[nbElem++] = strdup(token);
}
free(copy);
return strarray;
} |
Dans gdb, je vois que le SIGSEV est leve sur l'instruction suivante *strarray[nbElem++] = strdup(token);, mais je n'arrice pas a comprendre pourquoi.
Autres petites questions annexes:
- pourquoi est-ce que le passage par reference necessite un niveau d'indirection supplementaire?
- Ici, je laisse la responsabilite a l'appellant de liberer le tableau retourne ainsi que ses elements. Quelles sont les bonnes pratiques dans ce cas?
Merci beaucoup.