HELP! De-allocazione di più array a 1 e a 2 dimensioni

di il
2 risposte

HELP! De-allocazione di più array a 1 e a 2 dimensioni

Salve a tutti!
Vi chiedo cortesemente una mano: da due giorni sto penando per trovare una soluzione a questo problema: per implementare un programma in C devo allocare e poi deallocare diversi array ad 1 o 2 dimensioni, ma nonostante esegua una 'free' per ogni 'malloc' come da manuale puntualmente il codice salta durante la deallocazione finale con un bel segmentation error.
Segnalo che il programma funziona perfettamente e mi fornisce ogni risultato, ma 'scoppia' solo alla fine.
Utilizzo ubuntu 12 come OS e gcc come compilatore
Di seguito la porzione di codice incriminato: lancio la prima funzione all'inizio del main e la seconda ovviamente alla fine. Brevemente vi indico che tutti gli array sono monodimensionali, tranne x, c, cr che sono bidimensionali e dichiarati come puntatori a int* e int**, inizialemente avevo usato la malloc, poi ho riscritto il tutto con la calloc, ma il risultato è lo stesso:

void riservaMemoria(){

int i;

a= calloc(sizeof(int),MAX_M);
b= calloc(sizeof(int),MAX_N);

u= calloc(sizeof(int),MAX_M);
v= calloc(sizeof(int),MAX_N);

po= calloc(sizeof(int),MAX_M);
pd= calloc(sizeof(int),MAX_N);

xo= calloc(sizeof(int),MAX_M);
xd= calloc(sizeof(int),MAX_N);


c= (int **)calloc(sizeof(int **),MAX_M);
cr=(int **) calloc(sizeof(int **), MAX_M);
x= (int **)calloc(sizeof(int **),MAX_M);


for (i=1;i<=MAX_M;i++)
c=(int *)calloc(MAX_N,sizeof(int));


for (i=1;i<=MAX_M;i++)
cr=(int *)calloc(MAX_N,sizeof(int));

for (i=1;i<=MAX_M;i++)
x=(int *)calloc(MAX_N,+sizeof(int));


}
/*****************************************************************************************/
void rilasciaMemoria(){

int i;

free(a);
free(b);
free(u);
free(v);

free(po);
free(pd);
free(xo);
free(xd);

for (i=1;i<=MAX_M;i++)
{
free(&cr);
free(&x);
free(&c);

}
free(x);
free(cr);
free(c);
}

Ho utilizzato gbd (che conosco pochissimo) per vedere il core dump e fare un debug e questo è il risultato:


Errore di segmentazione (core dump creato)
miopc@miopc-System-Product-Name:~/Scrivania$ gdb ./ung core GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/marcello/Scrivania/ung...(no debugging symbols found)...done.

warning: exec file is newer than core file.
[New LWP 4913]

warning: Can't read pathname for load map: Errore di input/output.
Core was generated by `./ung'.
Program terminated with signal 11, Segmentation fault.
#0  0xb75d42de in _int_free (av=0xb770c440 <main_arena>, 
    p=0x910b000, have_lock=0) at malloc.c:3912
3912	malloc.c: File o directory non esistente.
(gdb) 
Sinceramente non so più dove sbattere il cranio ... C'è qualcuno che possa darmi qualche suggerimento? Grazie di cuore!:)

2 Risposte

  • Re: HELP! De-allocazione di più array a 1 e a 2 dimensioni

    Gli errori :

    1) deve essere

    c= (int **)calloc(sizeof(int *),MAX_M);

    così anche per gli altri doppi puntatori

    2) deve essere ogni for

    for (i=0;i<MAX_M;i++)

    altrimenti vai oltre la memoria allocata.

    E vedrai che funziona tutto
  • Re: HELP! De-allocazione di più array a 1 e a 2 dimensioni

    GRAZIE!!!!!!!! Era proprio quello il problema... gli indici! facendo un for con i=0;i<MAX_M;i++
    e dellocando successivamente con un ciclo analogo tutto ora gira correttamente!
    Segnalo che per la deallocazione ho ustao questa sintassi:
    void rilasciaMemoria(){
    
    int i;
    free(a);
    free(b);
    free(u);
    free(v);
    free(po);
    free(pd);
    free(xo);
    free(xd);
    for (i=0;i<MAX_M;i++)
    {
    	free(cr[i]);
    	free(x[i]);
    	free(c[i]);
    }
    free(x);
    free(cr);
    free(c);
    }
    /code]
    
    
    
     f18 GRAZIE ANCORA !!!!! f22
Devi accedere o registrarti per scrivere nel forum
2 risposte