Les tableaux multidimensionnels alloués par calloc
J'ai une question sur la façon dont la mémoire est allouée lorsque je calloc
. J'ai eu un coup d'oeil à cette question, mais il ne traite pas de la façon dont la mémoire est allouée dans le cas d'un allouée dynamiquement tableau à deux dimensions.
Je me demandais si il y avait une différence dans la mémoire de représentation entre l'une des trois façons suivantes d'allouer dynamiquement un tableau 2D.
De Type 1:
double **array1;
int ii;
array1 = calloc(10, sizeof(double *));
for(ii = 0; ii < 10; ii++) {
array1[ii] = calloc(10, sizeof(double));
}
//Then access array elements like array1[ii][jj]
De Type 2:
double **array1;
int ii;
array1 = calloc(10 * 10, sizeof(double *));
//Then access array elements like array1[ii + 10*jj]
Type 3:
double **array1;
int ii;
array1 = malloc(10 * 10, sizeof(double *));
//Then access array elements like array1[ii + 10*jj]
De ce que je comprends de calloc
et malloc
, la différence entre les deux derniers, c'est que calloc
est mise à zéro de tous les éléments de la matrice, alors que malloc
ne sera pas. Mais qui sont les deux premières façons de définir la matrice d'équivalent dans la mémoire?
calloc
. Ne sais pas si il y a une vraie différence avec le Type 1 bien que.vraiment juste l'espace supplémentaire pour les pointeurs et le fait que les blocs de 10 doubles, peut-être non contigus
Oh, en fait, ne pense pas de cette. Bon point.
Les cas 2 et 3 ne pas allouer de doubles.
double possible de Comment sont multi-dimensions des tableaux formatés en mémoire?
OriginalL'auteur Kitchi | 2013-05-23
Vous devez vous connecter pour publier un commentaire.
Pas tout à fait. Dans le second type, ils sont presque certainement contigus, alors que dans le premier type, ce n'est pas sûr.
De Type 1: représentation en mémoire ressemblera à ceci:
De Type 2: représentation en mémoire ressemblera à ceci:
OriginalL'auteur Ziezi
Exemple Simple
OriginalL'auteur Monis Majeed
Dans la première méthode, vous allouer 10 pointeurs de double, et 100 à double. Dans le second cas, vous allouer 100 pointeurs à double.L'autre différence est que dans le second cas, vous allouer un gros bloc de mémoire, de sorte que tous les éléments de votre tableau sont dans le même bloc. Dans la première méthode, chaque "ligne" de votre tableau est dans un bloc différent que les autres.
Bien que, dans le second cas, votre tableau doit être un double* au lieu d'un double**, parce que, dans cette façon de répartir, de votre tableau ne contient que des pointeurs de double de double.
Première méthode : 10 pointeurs, 100 double, deuxième méthode : 100 pointeurs, pas de double, ouais, pas même montant de mon mauvais. Mais la deuxième méthode n'a pas encore de double alloué.
Édité pour les corrections.
OriginalL'auteur Marrow Gnawer
Sur le cas 1, vous faites:
Remarque: Vous ne pouvez pas supposer que la zone de mémoire est continue, il existe peut-être des lacunes.
Sur le cas 2 que vous faites:
Le cas 3 est le même que le cas 2, mais ce n'est pas de l'initialisation de la mémoire. La différence entre le cas 1 et 2 & 3, c'est que le premier cas vous avez vraiment 2D structure de la mémoire. Par exemple si vous voulez échanger les lignes 1 et 2, vous pouvez juste changer les pointeurs:
Mais si vous voulez faire la même chose dans les 2&3 cas où vous avez besoin pour faire du vrai memcpy. Ce qu'il faut utiliser? Tout dépend de ce que vous faites.
La première méthode utilise peu plus de mémoire: si vous avez des tableau de 1000x10 puis la première version de l'utilisation 1000*8 + 1000*10*8 (sur système 64 bits), tandis que les 2&3 utilisera uniquement 1000*10*8.
Vous avez absolument raison. C'est ce que j'ai essayé de l'expliquer sur le dernier paragraphe avec les chiffres, mais a 'typo' en disant: "deuxième", comme c'était supposé être "premier". J'ai édité le post pour cela.
Vous êtes conscient que les cas 2 et 3 ne pas allouer de la double à tous, mais seuls les pointeurs à ceux-ci, êtes-vous?
Eh bien ils ont tous les deux allouer partie de la mémoire (pas le double de la mémoire ou double* la mémoire, c'est juste de la mémoire!) et avec 64bit machine sizeof(double*) == sizeof(double) == 8 mais sur 32 bits machine sizeof(double*) == 4, alors que sizeof(double) == 8. Donc, oui, vous avez raison, le cas 2&3 sur le code d'exemple deux sont mauvais, ils devraient allouer de la mémoire des éléments de taille double, pas de double*.
OriginalL'auteur susundberg