dynamique de l'allocation de tableau de tableaux en C
Je ne pas vraiment comprendre certaines choses de base en C comme allouant dynamiquement tableau de tableaux.
Je sais que vous pouvez faire:
int **m;
pour déclarer une 2 dimensions tableau (qui par la suite serait alloué à l'aide de certains *alloc fonction). Il peut aussi être "facilement" accessible en faisant *(*(m + line) + column)
. Mais comment dois-je attribuer une valeur à un élément du tableau? À l'aide de gcc la déclaration suivante m[line][column] = 12;
échoue avec une erreur de segmentation.
Tout l'article/docs seront appréciées. 🙂
ajout de "débutants tableau des" balises
Ce n'est pas "tableau de tableaux".
Ce n'est pas "tableau de tableaux".
OriginalL'auteur hyperboreean | 2009-01-18
Vous devez vous connecter pour publier un commentaire.
La
m[line][column] = 12
syntaxe est ok (à conditionline
etcolumn
sont dans la gamme).Cependant, vous n'avez pas écrit le code que vous utilisez pour l'allouer, de sorte qu'il est difficile de savoir si c'est juste ou faux. Il devrait être quelque chose le long des lignes de
Côte-notes:
Qui serait d'allouer un tableau unidimensionnel de pointeurs. Ce que vous voulez est un tableau de pointeurs que chaque point à un autre tableau. Vous devez d'abord allouer le tableau de pointeurs, puis allouer de la mémoire pour chaque tableau qui est pointé.
Wow, deux pathétiquement inutile modifications. @chakrit: casting malloc est généralement considéré comme une mauvaise pratique en C il n'est pas nécessaire et peut masquer des erreurs. +1 pour la réponse originale à cette question.
malheureusement il dépend du compilateur mise en œuvre. Certains anciens compilateurs non standard mallocs qui nécessitent un plâtre. VisualStudio a été de cette façon jusqu'à ce que relativement récemment (ne me souviens pas la version exacte)
Casting malloc est de bonne pratique en C++, car elle est nécessaire si la variable de GAUCHE n'est pas un pointeur void. C'est une mauvaise pratique en C, car les mises en garde qu'il élimine les sont presque toujours des erreurs qui doivent être correctement pris en compte et la suppression de l'avertissement juste traite le symptôme.
OriginalL'auteur jpalecek
Votre syntaxe m[ligne][colummn] est correct. Mais pour utiliser un tableau 2D en C, vous devez allouer de la mémoire pour cela. Par exemple, ce code sera alloué de la mémoire pour un tableau de donnée de ligne et de colonne.
Remarque, j'ai laissé de côté l'erreur vérifie malloc pour des raisons de concision. Une vraie solution doit inclure.
OriginalL'auteur JaredPar
Ce n'est pas un tableau 2d - c'est un tableau de tableaux - donc il a besoin de plusieurs allocations.
OriginalL'auteur Douglas Leeder
Voici une version modifiée de quinmars solution qui n'alloue un bloc de mémoire, et peut être utilisé avec des valeurs générales par l'aimable autorisation de
void *
:Je ne suis pas sûr si c'est vraiment sûr de jeter
void **
àint **
(je pense que la norme permet les conversions de prendre place lors de la conversion vers/à partir devoid *
?), mais il fonctionne dans gcc. Pour être sur le côté sécuritaire, vous devez remplacer chaque occurence devoid *
avecint *
...Les macros suivantes de mettre en œuvre un type sûr de la version de l'algorithme précédent:
Utiliser comme ceci:
calloc
alloue et les zéros le tableau.init_array2d
est probablement superflu, à moins qu'il y est une version qui pourrait définir chaque cellule à une valeur donnée qui n'est pas(TYPE)0
OriginalL'auteur Christoph
Bien que je suis d'accord avec les autres réponses, il est dans la plupart des cas préférable d'allouer la totalité de l'ensemble à la fois, parce que malloc est assez lent.
Gratuit le tableau il suffit de faire:
free(*array); free(array);
Remarque: cette solution ne fonctionne que si vous ne voulez pas changer l'ordre des lignes, car vous pourriez alors perdre l'adresse du premier élément, qui vous devez libérer le tableau plus tard.
OriginalL'auteur quinmars
Humm. Comment sur une vieille façon de la fumée et des miroirs comme une option?
OriginalL'auteur EvilTeach
À l'aide de
malloc(3)
pour allouer le premier tableau et de mettre en il y pointeurs créé parmalloc(3)
devrait travailler avecarray[r][c]
car il doit être équivalent à*(*(array + r) + c)
, c'est dans la norme.OriginalL'auteur Keltia