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:
Le code de l'appellant est le suivant:
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 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; }
[/CODE]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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]);
Mon code fonctionne correctement si je renvoie le pointeur par return, mais bon, ce n'est pas ce que je veux:
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.
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 **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; }
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.
Partager