Je veux créer un éventail de pointeurs sur des tableaux de 3 flotteurs. Quelle est la bonne façon de faire cela? Alors comment vais-je libérer les données? Je suis sûr que je suis sûr que gratuit (array1); code> ne fonctionnerait pas, alors je libérerais chaque pointeur dans la matrice puis libérer le tableau, ou depuis que j'ai alloué trois flotteurs, serais-je libérer chaque flotteur, Ensuite, chaque ensemble de 3 flotteurs, puis l'ensemble du tableau ??? p> p>
3 Réponses :
Je veux créer un éventail de pointeurs sur des tableaux de 3 flotteurs. Quelle est la bonne façon de faire cela? P>
Pourquoi voulez-vous un tableau
de pointeurs vers des tableaux code>? Un tableaude matrices code ne serait-il pas suffisant? (Gardez à l'esprit que les tableaux sont déjà ressemblant à un pointeur, ils ne sont pas transmis par la valeur, plutôt que l'adresse du premier élément est passée lorsqu'un tableau est transmis comme un argument à une fonction). P>// free the individual arrays for (int i = 0; i < SIZE; i++) free(arr[i]); // free the array of arrays free(arr);
Si vous connaissez la taille de la matrice au moment de la compilation (et que vous le faites, si taille code> est une constante de la compilation), vous devriez simplement déclarer une matrice bidimensionnelle. Vous n'avez pas besoin de libérer cela du tout (et ne devez pas). float (*array1)[3] = calloc(3*nrows, sizeof (float));
Une règle générale est que Si vous voulez un tableau de deux dimensions avec une taille connue du temps de compilation, utilisez simplement un tableau de deux dimensions! Si vous voulez un tableau de deux dimensions et que vous ne savez pas que la taille de la compilation, vous voulez le plus probablement Pour utiliser un calloc de diamocensionnel standard, unique () et un getter approprié. p> bien sûr remplacer les définitions avec des variables appropriées. p> en le faisant sera: p> masloc () code> ou calloc () code> Vous devrez faire un gratuit () < / Code> Appelez sur le pointeur retourné strong>. float val [5] [3] code> est parfaitement valide. p>
Pourquoi voudriez-vous déclarer un tableau unidimensionnel et faire toute la matrimonie vous-même, lorsque c fournit de bonnes installations pour cela? C'est juste faux.
@alexis Que préférez-vous faire? Allouer un tableau de pointeurs puis chaque rangée séparément?
L'OP était I> Demander à propos d'une gamme de pointeurs, qui a des utilisations valides - et de soutenir la notation de tableau en deux dimensions est l'une d'entre elles. Dans ce cas particulier, si taille code> n'est pas connu à l'avance, la solution appropriée est d'allouer un seul tableau Deux i> DIMENSIAL. Voir la dernière partie de ma réponse. (Mais oui, je voudrais plus tôt allouer une gamme de pointeurs que de gâcher avec une multiplication d'index comme celle-ci).
Ps. Si vous êtes inquiet pour l'optimisation du cache, vous ne devriez pas vous déranger avec la vérification de la plage. Rien de mal avec elle en principe, mais ce n'est pas le moyen C :-)
@Alexis Vous pensez que votre réponse est meilleure pour l'OP, je l'obtiens. Je pense aussi que c'est parfaitement valide. Cependant, je pense que la même chose de ma réponse aussi. C'est différent mais a ses utilisations. Il n'est définitivement pas faux i>. Et comme je ne sais pas avec certitude ce que veut l'OP, j'ai écrit ça. Le code il n'y a qu'un exemple. Je ne voudrais probablement pas vérifier les limites de mon application, mais puisque OP semble avoir des problèmes, j'ai ajouté cette partie. Si vous voulez discuter sur Internet, allez à Reddit ou Facebook.
Je suis d'accord avec une grande partie de ce que vous venez d'écrire. Il ne sert à rien d'en discuter, et je respecte le fait que mes objections ne sont pas convaincues par mes objections. Peut-être d'autres utilisateurs pourraient-ils peser avec des commentaires ou des votes pour aider à régler la question.
Vous devez uniquement créer des tableaux libres avec
calloc indicatif> et libérez-les dans l'ordre inverse de l'allocation: d'abord les matrices de ligne, puis la principale (si allouée aveccalloc code>). Il devrait y avoir ungratuit code> appeler chaqueappelococ code> appelez, de sorte que vous ne libérez pas les flotteurs individuels.@alexis: Si je devais utiliser ce tableau C dans une classe Objective-C, puis-je l'allouer avec calloc et libérer ou simplement utiliser une matrice [taille]?
Si vous connaissez la taille de la matrice au moment de la compilation, je déclare la matrice au lieu d'utiliser
calloc code>. Cela va aussi pour les lignes.Chaque
(flotteur ()) {0,0,0} code> sort de la portée après chacune d'une itération?Si vous l'utilisez dans une classe, je le déclarerais certainement avec une matrice [taille]. Gestion des objets avec un état alloué de manière dynamique est une douleur au cou - n'allez pas là à moins que vous ne l'iez.
@alexis je doute que ce sera utilisé dans une classe. La question est étiquetée c et non c ++.
@Eric, regarde le premier commentaire de l'OP (ci-dessus): "Si je devais utiliser ce tableau C dans une classe Objective-C, alors devrais-je ..."
@alexis ah. Très bien alors, continuez.