deallocazione memoria con free

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Toni
Linux 3.x
Linux 3.x
Messaggi: 999
Iscritto il: lun 30 gen 2006, 22:08
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3
Località: milano

deallocazione memoria con free

Messaggio 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: )

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: deallocazione memoria con free

Messaggio 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);

Avatar utente
Toni
Linux 3.x
Linux 3.x
Messaggi: 999
Iscritto il: lun 30 gen 2006, 22:08
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3
Località: milano

Re: deallocazione memoria con free

Messaggio da Toni »

stavo impazzendo .
grazie tantissimo :thumbright:

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: deallocazione memoria con free

Messaggio 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!

Rispondi