Repository 32bit  Forum
Repository 64bit  Wiki

deallocazione memoria con free

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 21: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: 984
Iscritto il: lun gen 30, 2006 23:08
Località: milano
Slackware: slackware-14
Kernel: 3.9.2
Desktop: xfce

Re: deallocazione memoria con free

Messaggioda phobos3576 » ven ago 01, 2008 22: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: dom apr 17, 2005 0: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 13:34

stavo impazzendo .
grazie tantissimo :thumbright:
Avatar utente
Toni
Linux 2.6
Linux 2.6
 
Messaggi: 984
Iscritto il: lun gen 30, 2006 23:08
Località: milano
Slackware: slackware-14
Kernel: 3.9.2
Desktop: xfce

Re: deallocazione memoria con free

Messaggioda phobos3576 » sab ago 02, 2008 14: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: dom apr 17, 2005 0: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 2 ospiti