11
votes

Manière correcte d'allouer et d'allouer et de libérer des tableaux de pointes vers des tableaux

Je veux créer un éventail de pointeurs sur des tableaux de 3 flotteurs. Quelle est la bonne façon de faire cela? XXX

Alors comment vais-je libérer les données? Je suis sûr que je suis sûr que gratuit (array1); 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 ???


8 commentaires

Vous devez uniquement créer des tableaux libres avec calloc et libérez-les dans l'ordre inverse de l'allocation: d'abord les matrices de ligne, puis la principale (si allouée avec calloc ). Il devrait y avoir un gratuit appeler chaque appelococ 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 . Cela va aussi pour les lignes.


Chaque (flotteur ()) {0,0,0} 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.


3 Réponses :


2
votes

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 tableau de 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);


0 commentaires

4
votes

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));


0 commentaires

2
votes

Une règle générale est que pour chaque fois que vous appelez masloc () ou calloc () Vous devrez faire un gratuit () < / Code> Appelez sur le pointeur retourné .

Si vous voulez un tableau de deux dimensions avec une taille connue du temps de compilation, utilisez simplement un tableau de deux dimensions! float val [5] [3] est parfaitement valide.

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é. xxx

bien sûr remplacer les définitions avec des variables appropriées.

en le faisant sera:

  • Sauvegardez-vous des allocs coûteux et libère
  • avoir moins de mémoire fragmentée
  • Simplifiez vos appels réelococ possibles
  • Assurez-vous que les données sont mieux mises en cache et accédées sans le problème commun [x] [y] [y] [y] [x] cache d'itération.

6 commentaires

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 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 n'est pas connu à l'avance, la solution appropriée est d'allouer un seul tableau Deux 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 . 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.