2015-11-26 28 views
7

In C99, la seguente riga di codice crea una variabile ptr sullo stack che punta a un'area di memoria nell'heap.Stack e heap nel linguaggio di programmazione

int *ptr = (int*)malloc(sizeof(int)*10); 

Dove sono le definizioni di stack e heap? Non sono riuscito a trovarli nelle specifiche del linguaggio C99.

Lo stack e lo heap sono definiti dal sistema operativo o dall'architettura del set di istruzioni o qualcos'altro?

Un'altra domanda correlata è che il concetto di stack e heap in C# è esattamente lo stesso del concetto in C99? Poiché il codice C# viene eseguito nel framework .Net, non sono sicuro che il concetto sia lo stesso di C99.

+0

Questo vi aiuterà parzialmente. Ha una bella risposta http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – niksofteng

+0

Grazie per le vostre informazioni. Tuttavia la domanda principale è: dove sono le definizioni? – mingpepe

+0

In C, "stack" e "heap" sono espressioni colloquiali. – immibis

risposta

1

L'heap è la quantità di memoria allocata a un determinato processo in esecuzione sulla macchina. Lo stack è una quantità di memoria generalmente inferiore allocata al thread attualmente in esecuzione sul processo specificato.

Quando si crea una variabile locale, questa viene archiviata nello stack. Questa selezione di memoria è chiamata stack perché, poiché tratta gli ambiti, diversi valori vengono spinti o spuntati dallo spazio indirizzabile come si farebbe con una struttura di dati dello stack.

Quindi quando malloc una variabile viene archiviata nell'heap e quindi salvata anche su più ambiti.

Nota che le cose memorizzate nell'heap devono essere liberate quando hai finito di usarle, mentre il sistema operativo lo gestisce automaticamente per cose in pila.

cassa http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

6

Pile e cumuli sono dettagli di implementazione; come hai scoperto, la definizione del linguaggio C non le menziona affatto.

La definizione del linguaggio C parla di durate di archiviazione di oggetti. Gli oggetti con durata di archiviazione auto hanno durate che si estendono oltre il blocco che li racchiude; è proprio così che lo stack hardware rende questo comportamento facile da implementare, quindi quasi tutte le implementazioni C lo fanno. Gli oggetti con durata di archiviazione allocated hanno una durata che va dalla chiamata malloc/calloc/realloc fino alla chiamata a free. Ancora una volta, quasi tutte le implementazioni C sfruttano l'heap di sistema per tale comportamento.

Tuttavia, un'implementazione non ha per utilizzare uno stack o un heap fornito dal sistema per soddisfare i requisiti di durata di archiviazione dell'oggetto; sarebbe solo un po 'più di lavoro.

+0

Qual è lo stack o l'heap fornito dal sistema? Nel punto di vista dell'hardware, sono la stessa cosa, giusto? Quindi sono definiti dal sistema operativo? – mingpepe

+0

@mingpepe - lo stack è solitamente definito dalla piattaforma hardware (la maggior parte delle CPU con cui ho familiarità dedica un paio di registri allo stack management). Gli heap sono mescolati tra hardware e sistema operativo. Le implementazioni differiscono. –

+0

Che cosa significa che gli heap sono mescolati tra hardware e sistema operativo? – mingpepe