2009-06-29 12 views
5

Ich habe etwas C-Code, der so etwas wie ein Puzzle ist. Aus einem Grund, mit diesem Code zu tun, frage ich mich, wie ich feststellen kann, ob ein struct Objekt auf dem Heap oder Stack endet?Ist es auf dem Stack oder Heap?

Die Objekte sind nicht mit malloc oder calloc geschaffen. Sie beginnen ihr Leben in Form eines Arrays. Für die Zwecke dieses Posts werde ich die Struktur Emp anrufen.

Emp myEmp[6]; 

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

Die Objekte werden sortiert und auf verschiedene Weise und an einem bestimmten Punkt betätigt wird, werden die Objekte kopiert und dann übergeben an einen Array-Zeiger. Die Kopie erfolgt über memcpy. Die Objekte werden dann in etwa wie folgt eingefügt: Emp* emps_a[6].

Die Objekte gehen von einer Kopie und sind in den oben genannten emps_a zugewiesen.

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

Ich bin mir nicht sicher, ob einige oder etwas davon meine Frage betrifft. Ich brauche nie frei() oder mache Speicher aufräumen ... Ich fürchte, ich weiß nicht viel über C.

Die Hilfe wird sehr geschätzt.

+3

Faustregel: Wenn Sie malloc angerufen haben, müssen Sie frei anrufen. Die Umkehrung - Wenn Sie malloc nicht angerufen haben, dürfen Sie nicht frei anrufen - ist normalerweise, aber nicht immer wahr. (Einige Funktionen rufen malloc für Sie auf. Wenn sie dies tun, sollte dies in großen roten Buchstaben in der Dokumentation der Funktion geschrieben werden.) –

Antwort

17

verlassen globale Variablen und Variablen mit static Modifikator deklariert (die in einem separaten Speicherbereich zugewiesen werden) zur Seite, lokale Variablen in einem Funktionskörper deklariert werden auf dem Stapel reserviert, während alles, was Sie malloc verlangen auf dem Heap zugeordnet wird. Außerdem werden C99-Arrays variabler Größe und Speicher, die mit _alloca zugewiesen sind, auf dem Stack landen.

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 

Zum Beispiel in dem obigen Code, gibt es eine Reihe von int* Werten auf dem Stapel Adressen zu 10 verschiedenen Stellen in der Halde zu halten.

+0

... und "statische" Variablen sind wahrscheinlich in ihrer eigenen Speicherregion. –

+0

Ja, zusammen mit global deklarierten Dingen. –

+0

So, wie Sie in meinem obigen Beispiel sagen, endet alles auf dem Stapel. Es ist nicht möglich, dass irgendetwas auf dem Haufen landet? –

Verwandte Themen