tout le monde: Je viens juste de trouver une approche pour allouer une matrice 2D en C. En la pratiquant, je suis confus au sujet d'un bug inconnu.gestion de la mémoire pour un espace 2D alloué dynamiquement
est ici la fonction, première version:
//first version
static int ** my2DAlloc(int rows, int cols){
int ** array;
int * array_head;
int i;
int len = sizeof(int*)*rows + sizeof(int)*rows*cols + 1;
array = (int**)malloc(len);
memset(array, 0, len);
array_head = (int *) (array + rows);
for(i=0; i<rows; i++)
array[i] = array_head + i*cols ;
return array;
}
Je n'ai aucun problème avec cette version. Cependant, j'ai essayé de changer un peu le code, comme suit:
//second version
static int ** my2DAlloc(int rows, int cols){
int ** array;
int * array_head;
int i;
int len = sizeof(int*)*rows + sizeof(int)*rows*cols + 1;
array = (int**)malloc(len);
memset(array, 0, len);
//array_head = (int *) (array + rows);
for(i=0; i<rows; i++)
array[i] = (int *) (array + rows + i*cols); // <--- the major difference
return array;
}
En ce qui concerne cette deuxième version, il semble bien d'écrire des données à la matrice et lire les données sur. Mais lorsque je tente de libérer l'espace alloué, je reçois une erreur de système comme:
free(): invalid next size (fast): 0x00000000020df010
Il semble être une erreur de mémoire. Mais je ne pouvais pas comprendre le problème. Quelqu'un pourrait-il m'aider?
Merci & Cordialement
Comment écrivez-vous la ligne de code où vous libérez de l'espace? –
'array' est' int ** '. 'array_head' est' int * '. Les deux sont différents. – BLUEPIXY
Avez-vous vraiment l'intention de retourner un pointeur sur un pointeur d'int? Comme dans, cherchez-vous un tableau de pointeurs int? – jwdonahue