Corsi di Laurea
ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.
Accetto l'uso dei cookie
>Salve a tutti. Spesso uso l'aritmetica dei puntatori per accedere ad
>elementi di vettori. E' possibile farlo anche con matrici tipo a[5][5]?
T a[m][n];
significa un array di m array di n elementi di tipo T. In C (e C++) un
array decade, a meno di condizioni eccezionali, in puntatore al suo
primo elemento. Quindi scrivere: int a[5] e poi usare *(a+2) significa
far decadere 'a' al puntatore al suo primo elemento (quindi il
puntatore è di tipo int*) e incrementare l'indirizzo ottenuto di
2*sizeof(int) byte per raggiungere l'indirizzo del terzo elemento. Il
tuo 'a' è un array di 5 array di 5 elementi di tipo T (non l'hai
specificato), quindi se chiami S il tipo "array di 5 elementi di tipo
T", ottieni che 'a' è:
S a[5];
ora, scrivere *(a+2) significa far decadere 'a' al puntatore al suo
primo elemento (quindi il puntatore è di tipo S*) e incrementare
l'indirizzo ottenuto di 2*sizeof(S) byte per raggiungere l'indirizzo
del terzo elemento. Quello che ottieni è un elemento di tipo S, cioè a
sua volta un array. Essendo l'elemento un array di 5 elementi di tipo
T puoi riapplicare il ragionamento:
*(*(a+2)+3)
Fai cioè decadere il nuovo array *(a+2) in puntatore al suo primo
elemento di tipo T, quindi, incrementando l'indirizzo ottenuto di
3*sizeof(T) byte, raggiungi la posizione del quarto elemento di tipo
T.
Io penso che il funzionamento di malloc sia diverso rispetto a quello che ci ha descritto Vento che lunedì se ricordo bene ha detto "se uso un puntatore all'indirizzo X senza inizializzarlo, ed eseguo il programma più volte, il suo valore stampato cambia sempre a caso", ma penso che come disse una volta Percannella, quando uno dealloca una certa area di memoria, non è che viene distrutto il dato e riscritto con un valore casuale, ma viene solamente "liberato" in modo che il sistema operativo può lasciarlo disponibile agli altri programmi, senza tenerlo più impegnato, quindi il dato rimane lì bello bello fino a quando quell'area di memoria non viene sovrascritta, o fino a quando spengo il pc e quindi la RAM diventa nuovamente caotica. Un pò come quando uno cancella un file dall'HD: se non sono stati riscritti i cluster precedentemente dedicati, i file sono lì e possono essere recuperati con software ad hoc.Quando l'elenco è composto da più di una persona......dopo che invoco le "free" alla fine.....e provo a ristampare l'elenco di persone non risultano deallocati i cognomi (dovrebbe darmi lettere strane e invece mi stampa i rispettivi cognomi delle persone nell'elenco).....
free(p)L'allocazione è ok. Cmq nn dovresti mai utilizzare dati che hai già deallocato!
Lo sò enn li userò mai,la mia era giusto una stampa per vedere cosa succedeva dopo aver deallocato la memoria.....non dovresti mai usare dati che hai deallocato.
Hai ragione, non ci avevo pensato.la frase "se uso un puntatore all'indirizzo X senza inizializzarlo, ed eseguo il programma più volte, il suo valore stampato cambia sempre a caso" probabilmente si riferiva al fatto che se il puntatore all'indirizzo X non è inizializzato molto probabilmente a quell'indirizzo ci saranno "schifezze" in memoria, probabilmente dati lasciati da vecchi programmi eseguiti o semplicemente sequenze casuali di bit ancora non inizializzati perchè quell'area di memoria ancora deve essere usata da quando hai acceso il computer! E il fatto che il contenuto "cambia sempre a caso" ad ogni esecuzione è perchè ogni volta che lanci un programma viene allocata una diversa area di memoria riservata al processo...
Cmq prima di farti troppe seghe mentali secondo me dovresti aspettare le prossime lezioni dove i puntatori verranno approfonditi meglio
elenco[i] da errore, perchè la leggi_persona cerca un indirizzo. In parole poveresostituisci questo pezzo di codice quando accedi ad una persona
(elenco+i)con questo che è più decente, e rende meglio l'ideaelenco[i]come se fosse un vettore allocato staticamente (funziona con qualsiasi puntatore)
*(elenco+i)=elenco[i]
(elenco+i)=&elenco[i]
0 utenti, 0 ospiti, 0 utenti anonimi