Repository 32bit  Forum
Repository 64bit  Wiki

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.

deallocazione memoria con free

Messaggioda Toni » ven ago 01, 2008 20:54

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
Toni
Linux 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: lun gen 30, 2006 22:08
Località: milano
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3

Re: deallocazione memoria con free

Messaggioda phobos3576 » ven ago 01, 2008 21:54

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
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: deallocazione memoria con free

Messaggioda Toni » sab ago 02, 2008 12:34

stavo impazzendo .
grazie tantissimo :thumbright:
Avatar utente
Toni
Linux 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: lun gen 30, 2006 22:08
Località: milano
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3

Re: deallocazione memoria con free

Messaggioda phobos3576 » sab ago 02, 2008 13:53

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!
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti