2009-06-29 3 views
5

Ho un codice C che è qualcosa di un puzzle. Per un motivo che ha a che fare con questo codice, mi chiedo come posso sapere se un oggetto si esaurisce nell'heap o nello stack ?È nello stack o heap?

Gli oggetti sono non essere creato con malloc o calloc. Iniziano la loro vita sotto forma di un array. Ai fini di questo post, chiamerò la struct Emp.

Emp myEmp[6]; 

/* Each myEmp[?] item is populated in code */ 

Gli oggetti vengono ordinati e manipolati in vari modi e ad un certo punto, gli oggetti vengono copiati e poi consegnato a un array puntatore. La copia viene effettuata tramite memcpy. Gli oggetti vengono quindi inseriti in qualcosa come: Emp* emps_a[6].

Gli oggetti passano da una copia e sono assegnati al precedente emps_a.

int i; 
for(i = 0; i < n; i++) 
{ 
    emps_a[i] = myEmpsCopy + i; 
} 

non sono sicuro se alcuni o niente di tutto questo ha attinenza con la mia domanda. Non ho mai bisogno di liberare() o di pulire la memoria ... Temo di non sapere troppo di C.

L'aiuto è molto apprezzato.

+3

Regola generale: se hai chiamato malloc, devi chiamare gratis. L'inverso - Se non hai chiamato malloc, non devi chiamare gratis - è di solito, ma non sempre, vero. (Alcune funzioni chiameranno malloc per te. Se lo fanno, questo dovrebbe essere scritto in grandi lettere rosse nella documentazione della funzione.) –

risposta

17

Lasciando le variabili e le variabili globali dichiarate con il modificatore static (che sono destinati a una regione di memoria separato) a parte, le variabili locali dichiarate nel corpo di una funzione sono allocati sullo stack, mentre comunque si voglia chiamare malloc per è allocato sul mucchio. Inoltre, gli array di dimensioni variabili C99 e la memoria allocata con _alloca finiranno in pila.

int* x[10]; // The addresses are held on the stack 
int i;  // On the stack 
for(i = 0; i < 10; ++i) 
    x[i] = malloc(sizeof(int)*10); // Allocates memory on the heap 

Ad esempio, nel codice precedente, c'è una matrice di valori int* sulla pila tiene indirizzi a 10 posizioni differenti in mucchio.

+0

... e le variabili "statiche" sono probabilmente nella loro propria area di memoria. –

+0

Sì, insieme a cose dichiarate globalmente. –

+0

Così dicendo nel mio esempio sopra, tutto finisce in pila. Non è possibile che qualcosa finisca nell'heap? –