Originariamente inviato da _d4vid3_
Salve,
vi scrivo per porvi alcune domande su questioni sul C che non ho capito dal mio testo di info.
1. E' corretto se dico che per ogni elemento di un array viene allocata sempre una cella(e quindi una parola) di memoria? (anche se, ad es, il tipo degli elementi dell'array richiede meno di una cella)?
"cella" è poco chiaro, così come "parola".
L'unità di indirizzamento (non su tutti i processori, ma su quelli diciamo così "usati") minimo
è il byte (8 bit).
Ricorda che "allocazione" non significa un granchè, unicamente "tieni l'indirizzo di un oggetto" il quale, come accennato, può essere al minimo di 8 bit.
Alcuni (=molti) processori (e compilatori), per ragioni di efficienza, possono allocare la memoria in multipli interi di 8 bit.
Come 16, 32 o addirittura 64 bit (=2,4,8 byte).
Questo per sfruttare il parallelismo di accesso alla memoria (trasferendo più byte in parallelo nello stesso intervallo di tempo).
Sempre per ragioni di efficienza, spesso, i blocchi di memoria vengono "allineati" a multipli di byte.
Sostanzialmente, per capirci, invece di avere indirizzi "pari" e "dispari" sono tutti pari, o addirittura multipli di 4

2. Ho capito che le celle di memoria hanno un "numero d'ordine"... ma non ho ben chiara la differenza tra indirizzo fisico e indirizzo logico (che, se ho capito bene, viene tradotto nell'indirizzo fisico dal gestore della memoria del sistema operativo); e, collegato a questo discorso, che tipo di indirizzo è contenuto in una variabile puntatore?
Il meccanismo che consente di passare da un indirizzo logico (quello che il programma "vede") e quello fisico (la RAM) è assai complesso (e variegato).
Alla stragrossa dato un puntatore che vale 1000, il programma "pensa" che si riferisca al millesimo byte della RAM, mentre in realtà può corrispondere a qualsiasi indirizzo fisico (e pure non fisico, ossia virtuale), poniamo 10234546
Ciò non avviene, ovviamente, in modalità reale (per i processori 86), ma parliamo sostanzialmente dei jurassico (o quasi)
Un'ultima curiosita'... so che se non si inizializza a zero una variabile la relativa cella di memoria potrebbe essere gia' piena, e quindi cio' puo' comportare errori....come mai pero' si verifica questo?Quando termina l'esecuzione di un programma non dovrebbe venire rilasciata la memoria precedentemente allocata per esso?

Grazie a tutti.
la spiegazione è varia
Innanzitutto un byte di memoria che il programma vede è virtuale, ossia non corrisponde ad un indirizzo fisico, anzi può addirittura essere rilocato dinamicamente (MMU).

Poi "allocare" non significa un granchè, anzi meglio provo a riassumere.

Supponi di avere 10 monete da 1 euro, ognuna numerata da 1 a 10.

Supponi di "prestarle" (allocarle), dandone un numero qualsiasi tra 1 e 10 a chi te le chiede.
3 a tizio, 2 a caio, 4 a sempronio (1 libera).

E' chiaro che queste monete-byte non vengono "create", vengono semplicemente "prestate".
Quando vengono "rilasciate" (ossia tornano al banco) il valore che hanno è... quello che avevano