À l'aide de malloc pour la répartition des multi-dimensions des tableaux avec différentes longueurs de ligne
J'ai le texte suivant C
code :
int *a;
size_t size = 2000*sizeof(int);
a = (int *) malloc(size);
qui fonctionne très bien. Mais si j'ai le texte suivant :
char **b = malloc(2000*sizeof *b);
où chaque élément de b
a une longueur différente.
Comment est-il possible de faire la même chose pour b
comme je l'ai fait pour a
; c'est à dire le code suivant tiendrait-elle correcte?
char *c;
size_t size = 2000*sizeof(char *);
c = (char *) malloc(size);
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous devez allouer un tableau de pointeurs comme
char **c = malloc( N * sizeof( char* ))
, puis allouer chaque ligne avec un appel séparé àmalloc
, probablement dans la boucle:Si vous connaissez le nombre total d'éléments (par exemple
N*M
) vous pouvez le faire en une seule allocation.free
pour chaquemalloc
. Vous devez faire une boucle par lachar*
variables en les libérant, puis libérer lechar**
.La forme typique pour allouer dynamiquement un NxM tableau de type T est
Si chaque élément de la matrice a une longueur différente, puis remplacez M à la longueur appropriée pour cet élément; par exemple
free
la mémoire allouée?a[i]
d'abord, puis de gratuita
.Équivalent de l'allocation de mémoire pour
char a[10][20]
serait comme suit.J'espère que cela a l'air simple à comprendre.
L'autre approche serait d'allouer un espace contigu de mémoire comprenant bloc d'en-tête des pointeurs vers les lignes ainsi que des corps de bloc pour stocker des données réelles dans les lignes. Ensuite, il suffit de marquer la mémoire par l'attribution d'adresses de la mémoire du corps à l'pointeurs dans l'en-tête sur chaque ligne. Il serait comme suit:
L'avantage de cette approche est à la fois élégante et libération de la mémoire et de la capacité à utiliser semblable au tableau de notation pour accéder aux éléments de l'résultant tableau 2D.
double
. C'est très important ceci est pris en compte, car il peut facilement conduire à une erreur de bus à cause d'un mauvais alignement des données. Une solution générale doit s'assurer que les données-les lignes commencent sur une limite de 8 octets, de décisions d'allocation supplémentaire d'espace et d'ajuster en conséquence lors de l'affectation de pointeurs à la primaire pointeur de segment.columnSizes[]
?Si chaque élément de b a différentes longueurs, alors vous devez faire quelque chose comme:
Je pense qu'une des 2 étapes de l'approche est la meilleure, parce que c 2-d les tableaux sont juste et tableau de tableaux. La première étape consiste à allouer un tableau unique, puis la boucle à travers elle allocation des tableaux pour chaque colonne que vous allez. Cet article donne de bons détails.
2-D De La Matrice De L'Allocation De Mémoire Dynamique
malloc n'alloue pas sur les limites précises, de sorte qu'il doit être présumé qu'elle alloue sur une frontière d'octet.
Le pointeur retourné peut alors pas être utilisé si converti en un autre type, car l'accès à ce pointeur sera probablement produire une violation d'accès mémoire par le CPU, et la demande sera immédiatement arrêté.