Newsgroup: it.comp.lang.c
Titolo: Allocazione dinamica della memoria

Ciao a tutti,
il mio problema č che non riesco ad allocare piů di 13 righe in una matrice
dinamica.
Al primo indice corrisponde la riga, al secondo indice i 20 elementi di una
stringa contente numeri binari (in fomato char* non int) di cui poi ne devo
fare la moltiplicazione.
Forse piů che matrice č semplicemente un vettore di vettore (dove al primo
elemento corrispode la prima stringa, al secondo la seconda stringa,
ecc...).
Nella main dichiaro la matrice e alloco lo spazio per la prima riga:
    char **matrice;
    matrice = (char **) calloc (1, sizeof(char*));
    matrice[0] = (char *) malloc (20*sizeof(char));
Ho una funzione "add_item" che mi alloca lo spazio per la riga successiva e
mi restituisce il numero totale di righ allocate fino a quel momento:
    int add_item(char ** matrice)
    {
        static int num_of_elem = 0;
        num_of_elem++;
        matrice = (char **) realloc (matrice, num_of_elem + 1);
        matrice[num_of_elem] = (char *) malloc (20*sizeof(char));
        return (num_of_elem);
    }
Sinceramente mi sembra strano che dopo 13 allocazioni (oltretutto sempre e
solo 13, che porta pure sfortuna...) mi venga dato l'errore Access Violation
at address ecc...
Ringrazio chiunque abbia voglia di perdere tempo dietro questo problema.
ps. per Giuseppe Macario:
ti ringrazio tantissimo per l'aiuto che mi hai dato riguardo pile e code.
l'esame l'ho fatto ed č venuta fuori una cosa eccezionalmente eccezionale.
Ora aspetto l'orale che mi confermi almeno almeno il 30! (viva la
modestia...)
Ciao!!
May

 int add_item(char ** matrice)
Il problema e' qui.
La tua funzione compie una riallocazione della memoria agendo sul puntatore
e per modificare il puntatore, devi modificarne il valore, quindi devi
passrlo per riferimento:
int add_item(char ***pmatrice)
{
    *pmatrice = malloc(...) ;
In ogni caso, permettimi di sottolineare due cose:
I cast sul valore di ritorno di malloc() sono inutili e dannosi, in C.
Se stai compilando con un compilatore C++ (come presumo) allora lasciali, se
vuoi che il programma venga compilato, ma ricordati che, in C, a differenza
del C++, non sono necessari e sono portatori di errori.
Inoltre, sizeof(char), in C, vale sempre 1, quindi puoi ometterlo.
Terza cosa (+ importante): devi sempre compiere un controllo, dopo le
allocazioni di memoria, non e' affatto detto che una allocazione vada sempre
a buon fine.
Nel caso di realloc(), se l'allocazione non riesce, hai un memory-leak,
perdi il riferimento al vecchio spazio, ovvero non riesci piu' a
deallocarlo.
--------------------------------
Inviato via 
http://usenet.libero.it

 deallocarlo.
Riassumendo:
malloc -> mi da NULL
realloc -> memory-leak
Perdendo il riferimento al vecchio spazio allora non riesco neanchè più ad
usarlo oltre che a deallocarlo?
E se ho un memory-leak come faccio a saperlo senza che mi vada in crash il
programma?
Ciao e grazie tantissime!
May

 realloc anche se non ci ha ben spiegato perchè...
Perche' e' rimasto fermo alla prima versione di C (parliamo di pre-ANSI)?
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

Perche' e' rimasto fermo alla prima versione di C (parliamo di pre-ANSI)?
O più semplicemente perché compilano col Turbo C++ (o anche molti
altri) che mette automaticamente l estensione .cpp e quindi compila in
modalità C++.
-- 
Marco Barisione (ICQ 84277092)

 programma?
Controllando la memoria occupata dal programma, e usando un profiler.
Ciao,
 Emmanuele.
-- 
Emmanuele Bassi (Zefram)           [ 
http://www.radiance.d2g.com/~zefram
 ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4

 programma?
Non puoi, e' questo il bello.


Almeno non ricordo che lo standard prescriva questo.
No, anche perché non potrebbe funzionare nella maggior parte dei casi.


 Non puoi, e' questo il bello.
Fantastico! tutto questo è veramente incoraggiante! :-)))))

 tre funzioni interessate (in tutto saranno 50-60 righe di codice) perchč
mi
chi tace acconsente :-)) lo prendo come un si.
Comunque ho riassunto il codice in poco piů di 15 righe:
main() {
        char ** num = NULL;
        num = (char **) calloc(1, sizeof(char *));
        num[0] = (char *) calloc(MAX_SIZE, sizeof(char));
        compila_matrice( &num )
        .........
        .........
}
compila_matrice(char ***num){
        ciclo while {
                ..........
                add_item( num )
        }
}
int add_item(char ***num)
{
        static int num_of_elem = 0;
        num_of_elem++;
        *num = (char **) realloc(*num, num_of_elem + 1);
        (*num)[num_of_elem] = (char *) calloc(MAX_SIZE, sizeof(char)); <--- qui mi
da sempre Access Violation at address xxxxxxx e me lo da sempre alla 13/14
allocazione.
        return (num_of_elem);


         ciclo while {
while cosa? In un problema di corruzione della memoria potrebbe essere
utile conoscere i vincoli sui cicli. Non sei daccordo :-)
Se proprio non ti va di postare l'intero codice, mandamelo in m-box.
Non e' che si capisca molto che cosa vuoi fare...
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Tripla indirezione? Non e' che se ne vedano tante in giro :-)
http://groups.google.com/groups?q=TheMatrix+author:Andrea+author:Laforgia&hl=it&lr=&ie=UTF-8&selm=gd1rmsk940g7s4sr76q732fbpanupm6fg5%404ax.com&rnum=1
:-)


 Tripla indirezione? Non e' che se ne vedano tante in giro :-)
http://groups.google.com/groups?q=TheMatrix+author:Andrea+author:Laforgia&hl=it&lr=&ie=UTF-8&selm=gd1rmsk940g7s4sr76q732fbpanupm6fg5%404ax.com&rnum=1
:-)
--------------------------------
Inviato via 
http://usenet.libero.it

 :-)
:-O !!!!!
sono sbalordito...


 Non e' che si capisca molto che cosa vuoi fare...
Ti ringrazio. te lo mando subito!
Ciao!
May
