Allocazione memoria in C su Linux
La memoria di un processo è così organizzata:
------------------------------
| Indirizzo | Contenuto |
------------------------------
| Max ------| Stack ----- |
| ---------- | ------------- |
| ---------- | Heap ------ |
| ---------- | Data ------- |
| 0 -------- | Text ------- |
------------------------------
In Data ci sono le variabili allocate staticamente?
Se nel codice scrivo "int z", allora z si troverà in Data?
------------------------------
| Indirizzo | Contenuto |
------------------------------
| Max ------| Stack ----- |
| ---------- | ------------- |
| ---------- | Heap ------ |
| ---------- | Data ------- |
| 0 -------- | Text ------- |
------------------------------
In Data ci sono le variabili allocate staticamente?
Se nel codice scrivo "int z", allora z si troverà in Data?
Risposte
Ciao,
aspetta aspetta non fare salti nelle astrazioni.
Di che parliamo:
- della struttura processo
- della suddivisione logica del codice C
- dell'allocazione in memoria del codice logicamente suddiviso
il tuo titolo dice una cosa, ma il post un'altra spiega meglio il tuo dubbio
aspetta aspetta non fare salti nelle astrazioni.
Di che parliamo:
- della struttura processo
- della suddivisione logica del codice C
- dell'allocazione in memoria del codice logicamente suddiviso
il tuo titolo dice una cosa, ma il post un'altra spiega meglio il tuo dubbio

"hamming_burst":
Ciao,
aspetta aspetta non fare salti nelle astrazioni.
Di che parliamo:
- della struttura processo
- della suddivisione logica del codice C
- dell'allocazione in memoria del codice logicamente suddiviso
il tuo titolo dice una cosa, ma il post un'altra spiega meglio il tuo dubbio
Spero di essere maggiormente chiaro.
Parliamo della struttura del processo. Appena un eseguibile viene eseguito, il codice sorgente (text) viene caricato in memoria e gli viene allocata una zona di memoria (data, heap e stack).
"Sergio":
[quote="hee136"]Se nel codice scrivo "int z", allora z si troverà in Data?
Puoi scrivere "int z" in tanti contesti. Ad esempio, se è una variabile locale andrà nello stack.[/quote]
void main() { int z = 12; ... }
Così va a finire in Data?
"Sergio":
[quote="hee136"]Così va a finire in Data?
Che io ricordi, no. Così:
int z = 12; void main() { ... }
sicuramente sì.[/quote]
Grazie

Se ci fossero due o più variabili, sono allocate una dopo l'altra?
Ipotizzando che un int occupi 4 byte, è corretto quanto scritto sotto?
int z1 = 12; -> z1 allocata nelle celle di memoria 1,2,3,4 int z2 = 98; -> z2 allocata nelle celle di memoria 5,6,7,8 void main() { ... }
Nel caso che avevo scritto io, vanno a finire nello Stack?
Se ci fossero due o più variabili, in che modo vengono allocate?
Mentre tutto cioò che è allocato dinamicamente con malloc e calloc va nello heap (correggetemi se sbaglio).
visto che Sergio ti ha consiglio di passare per il compilatore, consiglio di leggerti cosa è una "sezione" e lo standard ELF.
per un mini sunto su tutto questo:
- http://ar.linux.it/docs/A-C-X-more-en.html (v. Memory allocation) by Rubini
- http://ar.linux.it/docs/A-C-X-en.html by Rubini
- http://sourceware.org/binutils/docs-2.1 ... l#Sections by GNU Assembler
secondo me così ti chiarisci cosa davvero accade nella compilazione, cioè preparare il terreno per l'esecuzione e la relativa creazione del processo.
per un mini sunto su tutto questo:
- http://ar.linux.it/docs/A-C-X-more-en.html (v. Memory allocation) by Rubini
- http://ar.linux.it/docs/A-C-X-en.html by Rubini
- http://sourceware.org/binutils/docs-2.1 ... l#Sections by GNU Assembler
secondo me così ti chiarisci cosa davvero accade nella compilazione, cioè preparare il terreno per l'esecuzione e la relativa creazione del processo.

Vorrei solo aggiungere che quasi tutto quello di cui si sta discutendo dipende fortemente dal compilatore scelto (e dagli argomenti passati da linea di comando allo stesso). A patto che il risultato dell'esecuzione del codice sia conforme a quanto richiesto dallo standard, il compilatore può fare quello che vuole. Il compilatore può ad esempio eliminare parti di codice o variabili se ritiene che siano inutili e può riordinare le espressioni a piacimento (a patto che il risultato sia lo stesso). Una variabile locale può decidere di inserirla nello stack o usare semplicemente un registro. Anche se è sempre possibile sapere il comportamento del compilatore in una specifica situazione guardando il codice assembly generato, non è detto che il compilatore si comporterà esattamente nello stesso modo in un'altra situazione simile o nella stessa situazione con opzioni del compilatore diverse. In questi casi credo sia meglio evitare di fare generalizzazioni e verificare l'assembly generato nei casi specifici.