Pour faire ça proprement, c'est OK a condition que tu libères ça proprement quand tu n'en a plus besoin (dans une boucle, free(tab[index]) puis free(tab)).
Mais ça nécessite que tu connaisse la valeur de index en dehors de function (ou bien que tu alloues index+1 éléments et que tu mettes le dernier à NULL, comme indicateur de fin, et que aucun des autres array[index] ne soit à NULL)
Mais j'ai donné une solution plus simple récemment si les lignes de ton tableau sont de taille fixe (pas clair au vu de ton exemple si ton strlen(string) est constant ou variable) et que tu ne fais pas de réallocation:
Citation :
Une fonction, et avec une seule allocation:
Code :
- // dans une fonction c'est mieux, surtout qu'on retourne un pointeur, ce qui est optimal
- double** double_dynamicArray2D(int x, int y) {
- double** array = (double **) malloc((x * sizeof(double*)) + (x*y * sizeof(double)));
- if (array) {
- int i;
- for (i = 0; i < x; ++i) {
- array[i] = (double*)(array + x) + i * y;
- }
- }
- return array;
- }
- // Et on fait dans son code
- double** tab = double_dynamicArray2D(25, 100);
- // a ce stade, on peut employer tab comme un tableau
- ...
- free(tab);
|
La fonction fait une allocation unique (on colle les pointeurs en premier et les données derrière), et le gros avantage, c'est qu'un unique free suffit à libérer la mémoire.
|
C'est peut être adaptable à ton cas de manière simple. (si les lignes de ton tableau ne sont pas de taille fixe, c'est faisable mais nettement moins simple).
A+,
Message édité par gilou le 05-12-2015 à 14:41:41
---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --