2015-10-09 2 views
0

Je suis en train d'écrire 2 fonctions, l'une à l'allocation dynamique un tableau 2D, d'autres pour libérer ce tableau 2D:c- Allouer et gratuit 2D tableau

int allocate(int **array, unsigned int rows, unsigned int columns){ 
    int i; 
    for (i = 0; i < rows; i++) { 
    array[i] = malloc(columns * sizeof (int)); 
    } 
    /* Code fo fill the array*/ 
    return 1; 
} 
void de_allocate(int **v, unsigned int rows) { 
    int i; 
    for (i = 0; i < rows; i++) { 
    free(v[i]); 
    } 
    free(v); 
} 
int main(int argc, char **argv) { 
    int rows, columns; 
    rows = atoi(argv[1]); 
    columns = atoi(argv[2]); 
    int *ipp[rows]; 
    allocate(ipp, rows, columns); 
    de_allocate(ipp,rows); 
    return 0; 
} 

je dois respecter la signature de la fonction allouer:

int allocate(int **array, unsigned int rows, unsigned int columns) 

Et à la fin de la fonction d'allocation, ipp doit avoir accès au tableau 2D attribué.

Allouer fonction, il est vrai, mais en fonction de_allocate i un SIGABRT signal

+0

C'est * pas * un tableau 2D mais seulement une émulation de celui-ci. Ne faites pas qu'un tel code ne devrait être utilisé que dans un musée. Utilisez de véritables tableaux 2D. S'ils ont tendance à être gros, ne les allouez pas sur la pile et utilisez 'int (* ipp) [rows] = malloc (sizeof (double [lignes] [colonnes]))' allouer et 'free (ipp) 'pour le libérer et la fin. Aucune boucle for for n'est nécessaire. Ainsi, même vos fonctions ne serviraient plus à grand chose. –

Répondre

1

Le problème est que vous essayez de libérer une pile alloué var avec le code free(v);

Vous pouvez le faire si vous mallocated le tableau de pointeur, mais vous le déclarez localement dans main avec int *ipp[rows];

Changez-le en int **ipp = malloc(sizeof(int*)*rows); si vous souhaitez laisser de_allocate tel quel.

Vous pouvez le tester avec

#include <stdio.h> 
#include <stdlib.h> 

int allocate(int **array, unsigned int rows, unsigned int columns){ 
    int i; 
    for (i = 0; i < rows; i++) 
    { 
    array[i] = malloc(columns * sizeof (int)); 
    } 

    /* Code fo fill the array*/ 
    return 1; 
} 

void de_allocate(int **v, unsigned int rows) { 
    int i; 
    for (i = 0; i < rows; i++) 
    { 
    free(v[i]); 
    } 
    free(v); 
} 

int main(int argc, char **argv) 
{ 
    int rows, columns; 
    int temp = 0; 
    rows = atoi(argv[1]); 
    columns = atoi(argv[2]); 

    int **ipp = malloc(sizeof(int*)*rows); 

    allocate(ipp, rows, columns); 

    for (int i=0; i<rows; i++) 
     for (int j=0; j<columns; j++) 
      ipp[i][j] = temp++; 

    for (int i=0; i<rows; i++) 
     for (int j=0; j<columns; j++) 
      printf("ipp[%d][%d] = %d\n", i, j, ipp[i][j]); 

    de_allocate(ipp,rows); 
    return 0; 
} 
1
void de_allocate(int **v, unsigned int rows) { 
    int i; 
    for (i = 0; i < rows; i++) { 
    free(v[i]); 
    } 
    free(v); 
-----^---- 
here you are attempting to free a variable for which you didn't dynamically allocate memory in the first place 

}