Pagina 1 di 1

deallocazione memoria con free

Inviato: ven 1 ago 2008, 21:54
da Toni
ciao a tutti.

sto scrivendo una piccola libreria per le matrici . Non ho intenzione di reinventare la ruota etc etc .
Veniamo al dunque ecco il sorgente:

Codice: Seleziona tutto

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

struct _matrix_t
	{
	double **m;
	int r;
	int c;
	};


typedef struct _matrix_t matrix_t;
typedef double* M_STREAM;


void _matrix_stream_T(M_STREAM *dati) {
      int righe,colonne,a,b,i=2; 
      printf("\t     Immetti rispettivamente il numero di righe e di colonne :\n\t");
      scanf("%d",&righe);
      scanf("%d",&colonne);
      *dati=malloc(sizeof(double)*(righe*colonne+2));
      *(*dati)=righe;
      *(*dati+1)=colonne;
      for(a=0;a<righe;a++){
      	printf("\n Inserisci i %d elementi appartenenti alla riga %d,\n",colonne,a+1);
        printf(" separati dallo spazio, e premi invio:\n\t ");
        for(b=0;b<colonne;b++){
           printf("\n ");
           scanf("%lf",&(*(*dati+i))); 
           i++;
	   }
        }
      }

void _matrix_new(matrix_t *matrix,int r,int c){
        int i;
      	matrix->r=r;
        matrix->c=c;
       	matrix->m=malloc(sizeof(double *)*r);   
        for(i=0; i<=r; i++)
        	*((matrix->m) + i)=malloc(sizeof(double ) * c);
        return ;
        }  


int main(void) {
    M_STREAM dati;
    matrix_t a;
    _matrix_stream_T(&dati);
    _matrix_new(&a,dati[0],dati[1]);   /*commentando questa riga nessun errore*/
    free(dati);
  
    
    }

In esecuzione se inserisco righe=3 colonne=3 ottengo

Codice: Seleziona tutto

*** glibc detected *** prova: corrupted double-linked list: 0x0804a060 ***
======= Backtrace: =========                                              
/lib/libc.so.6[0xb7ebfb56]                                                
/lib/libc.so.6(cfree+0x90)[0xb7ec3370]                                    
prova[0x8048d5a]                                                          
/lib/libc.so.6(__libc_start_main+0xe0)[0xb7e6a390]                        
prova[0x80483c1]                                                          
======= Memory map: ========                                              
08048000-08049000 r-xp 00000000 08:02 1294       /home/toni2/matrix/prova 
08049000-0804a000 rw-p 00001000 08:02 1294       /home/toni2/matrix/prova 
0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]                   
b7d00000-b7d21000 rw-p b7d00000 00:00 0                                   
b7d21000-b7e00000 ---p b7d21000 00:00 0                                   
b7e53000-b7e54000 rw-p b7e53000 00:00 0                                   
b7e54000-b7f9a000 r-xp 00000000 08:01 28712      /lib/libc-2.7.so         
b7f9a000-b7f9b000 r--p 00146000 08:01 28712      /lib/libc-2.7.so         
b7f9b000-b7f9d000 rw-p 00147000 08:01 28712      /lib/libc-2.7.so         
b7f9d000-b7fa1000 rw-p b7f9d000 00:00 0                                   
b7fb6000-b7fc0000 r-xp 00000000 08:01 223027     /usr/lib/libgcc_s.so.1   
b7fc0000-b7fc1000 rw-p 00009000 08:01 223027     /usr/lib/libgcc_s.so.1   
b7fc1000-b7fc3000 rw-p b7fc1000 00:00 0                                   
b7fc3000-b7fc4000 r-xp b7fc3000 00:00 0          [vdso]                   
b7fc4000-b7fe0000 r-xp 00000000 08:01 28952      /lib/ld-2.7.so           
b7fe0000-b7fe2000 rw-p 0001b000 08:01 28952      /lib/ld-2.7.so           
bf8cd000-bf8e2000 rw-p bffeb000 00:00 0          [stack]                  
 Abortito          
nessun problema con righe!=3 && colonne=!3

Aggiungo che se non chiamo la funzione _matrix_new . Non ottengo nessun errore tutto liscio.
Grazie a tutti.
(é gradito qualche consiglio su come utilizzare in modo produttivo gdb :lol: )

Re: deallocazione memoria con free

Inviato: ven 1 ago 2008, 22:54
da phobos3576
Credo che l'errore sia quel i <= r in _matrix_new

Codice: Seleziona tutto

for(i=0; i<=r; i++)
           *((matrix->m) + i)=malloc(sizeof(double ) * c);
Così vai "fuori di uno" nell'allocazione delle righe.

Prova a mettere:

Codice: Seleziona tutto

for(i=0; i < r; i++)
           *((matrix->m) + i)=malloc(sizeof(double ) * c);

Re: deallocazione memoria con free

Inviato: sab 2 ago 2008, 13:34
da Toni
stavo impazzendo .
grazie tantissimo :thumbright:

Re: deallocazione memoria con free

Inviato: sab 2 ago 2008, 14:53
da phobos3576
Resta però il mistero del perché del crash solo con righe=3 e/o colonne=3.
Misteri del C; bisognerebbe esaminare il tutto con Gdb o con Valgrind.

Opinione di Nikolaus Wirth, creatore del Pascal, sul Linuguaggio C:
Nikolaus Wirth ha scritto: Il C è frutto della mente di un irresponsabile; per il bene degli studenti, bisognerebbe proibire l'insegnamento di quel linguaggio nelle scuole!
Opinione di Linus Torvalds sul Linuguaggio C:
Linus Torvalds ha scritto: Se anche l'unico scopo del C fosse quello di tenere alla larga i programmatori incapaci, già quello sarebbe un valido motivo per usarlo!