2017-10-18 13 views
2

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

+0

Comment écrivez-vous la ligne de code où vous libérez de l'espace? –

+0

'array' est' int ** '. 'array_head' est' int * '. Les deux sont différents. – BLUEPIXY

+0

Avez-vous vraiment l'intention de retourner un pointeur sur un pointeur d'int? Comme dans, cherchez-vous un tableau de pointeurs int? – jwdonahue

Répondre

3

Le problème dans la deuxième version est que vous faites l'arithmétique des pointeurs sur un int ** au lieu de int *, parce que vous avez la distribution en dehors de la arithmétique.

for(i=0; i<rows; i++) 
    array[i] = ((int *)(array + rows) + i*cols); // <--- the major difference 
+0

Salut, Barmar, vous avez raison, merci de signaler le problème. – MyCoy