Comment dois-je allouer de la mémoire pour un tableau 2d?
Comment dois-je déclarer un tableau 2d à l'aide de l'opérateur 'new'? Mon livre dit ceci:
int (*p)[4];
p=new[3][4];
mais il ne fait pas de sens pour moi. p est un pointeur vers un tableau de 4 entiers, alors comment peut-il être fait pour pointer vers un tableau 2d?
Double Possible de: stackoverflow.com/questions/936687/...
Pourquoi aucune de ces réponses acceptées? Vous avez des réponses qui expliquent simplement comment faire pour corriger votre erreur, quel est exactement le problème avec ce que vous faites, comment mieux écrire ce que vous essayez et comment mieux atteindre le résultat final d'un tableau 2D, en expliquant les avantages et les inconvénients de l'utilisation d'un tableau alloué dynamiquement vs quelque chose comme
il pourrait ne pas avoir le privilège d'accepter de répondre.
bon j'ai ma réponse
Double de stackoverflow.com/questions/936687/...
Pourquoi aucune de ces réponses acceptées? Vous avez des réponses qui expliquent simplement comment faire pour corriger votre erreur, quel est exactement le problème avec ce que vous faites, comment mieux écrire ce que vous essayez et comment mieux atteindre le résultat final d'un tableau 2D, en expliquant les avantages et les inconvénients de l'utilisation d'un tableau alloué dynamiquement vs quelque chose comme
std::vector
. Pourquoi n'avez-vous pas au moins commenté sur les réponses qui ne sont pas vous dire ce que vous voulez savoir, peut-être l'auteur de la réponse pourrait fournir les informations manquantes pour vousil pourrait ne pas avoir le privilège d'accepter de répondre.
bon j'ai ma réponse
Double de stackoverflow.com/questions/936687/...
OriginalL'auteur Nirvan | 2012-04-08
Vous devez vous connecter pour publier un commentaire.
Il semble que vous avez besoin de pointeur de pointeur. EDIT: bon, pour être plus exact, l'exemple suivant crée un tableau de pointeurs vers des tableaux.
D'abord faire:
Ici, vous avez créé tableau de pointeurs. Maintenant, vous devez créer un autre tableau pour chacun d'entre eux. Que vous pouvez le faire de cette façon:
Pour la libération de vous faire la même, mais en sens inverse:
Et enfin:
Maintenant, vous pouvez travailler avec elle. De cette façon, vous pouvez créer des N-dimensions, tableau, il suffit d'ajouter plus d' '*'. Si vous avez toute autre question particulière, demandez dans les commentaires, s'il vous plaît.
Mais, en général, pour plus d'info je vous recommande d'essayer au préalable par Google avec des questions comme "tableau 2D en C++" ou "allocation dynamique de tableau 2D en C++", j'. e. cette requête.
OriginalL'auteur Miroslav Mares
D'autres réponses couvrir d'avoir un tableau de pointeurs pour vos lignes, avec un pointeur vers un
int
tableau par ligne. Une autre option est de simplement attribuer un 1-D tableau assez grand pour contenir toutes les 2-D éléments du tableau:Alors au lieu d'utiliser le
p[r][c]
syntaxe, vous utilisezp[r * kNumCols + c]
. Dans cet exemple,kNumCols = 4
. C'est généralement ce qui est fait dans LAPACK style de nombreux calculs, car il garde les choses contiguës en mémoire et vous n'avez pas besoin d'allouer donc de nombreux blocs de mémoire.Remarque: en général, Cela est pas plus lent que l'autre dans la pratique, parce que le décalage de lignes de calcul est déplacé hors de la boucle par la commune de la sous-expression de l'optimisation. Aussi, de nombreux référenceurs savent à regarder pour ce modèle. En outre, en gardant vos données co-situé dans un unique bloc de mémoire, les données sont plus susceptibles de rester dans le cache.
En C++, vous pourriez mettre en œuvre les
p[][]
notation avec un assistant de classe de modèle:Cela permet d'optimiser le bas pour le même code que ci-dessus, mais vous permet d'utiliser
[][]
notation et nécessite de connaître vos dimensions du tableau au moment de la compilation. Exemple d'utilisation:Ce pourrait être converti pour faire des NC dans un membre de la classe au lieu d'un paramètre du modèle, mais alors l'objet final n'est pas seulement un pointeur plus:
Noter qu'aucun de ces classes besoin de copier les constructeurs, les opérateurs d'assignation, ou destructeurs, car ils ne prennent pas la propriété de la pointe-de mémoire, pas plus que d'un pointeur normal. Donc, pour libérer de la mémoire, il vous reste à faire:
Ou si votre compilateur ne peut pas le comprendre:
Pour tous ceux qui, il y a un long fil sur ici pour essayer de trouver ce que l'OP a été fait après. Malheureusement, avant l'OP pourrait expliquer lui-même et obtenir l'aide dont il est après les méta-la police est venue et a balayé tout ça de côté. Le long et à court de il était, ce (apparemment) n'est pas ce que l'OP est après
Suppose que j'ai besoin de rafraîchir ma télépathie.
OriginalL'auteur Mike DeSimone
Il y a plusieurs façons de déclarer des tableaux multidimensionnels en C.
Vous pouvez déclarer
p
explicitement comme un tableau 2D:(Notez que
new
n'est pas nécessaire ici pour les types de base, sauf si vous êtes à l'aide de C++ et souhaitez allouer sur le tas.)Ou vous pouvez la déclarer comme un vecteur (tableau 1D) de pointeurs, puis allouer de la mémoire pour chaque vecteur:
Ou, si vous ne savez pas, soit la dimension, vous pouvez attribuer la totalité du tableau 2D de manière dynamique:
OriginalL'auteur Adam Liss
Pour réellement répondre à la question:
Se rappeler qu'un tableau est équivalent à un pointeur vers le premier élément du tableau, de sorte que, par exemple, vous pouvez écrire:
Cela fonctionne pour un tableau à deux dimensions.
déclare un pointeur vers le premier élément d'un tableau à deux dimensions.
p
peut ensuite être rappelé à tout tableau à deux dimensions, aussi longtemps que son deuxième dimension est 4, donc par exemple, vous pourriez écrireBien sûr, vous pouvez également allouer de la mémoire dynamiquement:
Encore une fois, la deuxième dimension est d'être 4, mais vous pouvez varier la première dimension.
OriginalL'auteur Neil
Vous besoin de quelque chose comme ce
for (int i = 0 ; i < firstnumber ; i++ ) delete array_ptr[i]; delete [] array_ptr;
le code est de travailler pour moi. le résultat de valgrind montre que la mémoire est libérée. Il suffit de supprimer[] array_ptr a être hors de cycle.
OriginalL'auteur v01d