Ich kämpfe um die C-Regeln von malloc()/free() zu lernen. Betrachten Sie den folgenden Code, der gut läuft. (Unter Linux, kompiliert mit GCC.) Ich frage mich speziell über das Array arr
. Ich, dass Sie für alle Struktur-Elemente innerhalb das Array malloc haben ... aber, warum Sie nicht für das Arrayselbst malloc haben?Muss ich malloc() dieses Array nicht?
#include<stdio.h>
#include<stdlib.h>
#define ARR_SIZE 100
typedef struct containerStruct{
int data1;
int data2;
int data3;
// ...etc...
} container;
int main(){
container* arr[ARR_SIZE]; // Don't I have to malloc this?
int i;
for(i=0; i<ARR_SIZE; i++){
arr[i] = (container*) malloc (sizeof(container)); // I get why I have to malloc() here
}
...do stuff...
for(i=0; i<ARR_SIZE; i++){
free(arr[i]); // I get why I have to free() here
}
// Don't I have to free(arr) ?
return 0;
}
Ich vermute, dass die container* arr[ARR_SIZE];
Linie die Compiler alle erzählt es wissen muss für das Array den Platz im Speicher zu schnitzen, weshalb funktioniert dieser Code.
Aber irgendwie fühlt es sich immer noch nicht richtig an. Wenn ich etwas malloc(), reserviere ich Speicherplatz auf dem Heap, richtig? Aber mein container* arr[ARR_SIZE];
Aufruf erstellt das Array auf dem Stapel. Also ... das Array von Container * -Portern existiert auf dem Stapel, und all diese Container * -Zeiger verweisen auf eine Container-Struktur auf dem Heap. Ist das korrekt?
Für eine echte Überraschung, versuchen Sie 'container arr [ARR_SIZE];' ohne den Stern, und sehen Sie, dass Sie nicht 'malloc' brauchen, um ein Array zu erhalten. –
Sie deklarieren eine Reihe von Zeigern auf eine Weise, die 'malloc()' nicht erfordert. Sie müssen möglicherweise zu malloc() 'was sie zeigen; oder Sie könnten nicht, je nachdem, wie/ob Sie dclare das – Mawg