In der C-Programmierung können Sie jede Art von Zeiger als Argument an free übergeben. Woher weiß er, wie groß der Speicher ist, der freigegeben werden soll? Immer wenn ich einen Zeiger an eine Funktion übergebe, muss ich auch die Größe übergeben (d.h. ein Array mit 10 Elementen muss 10 als Parameter erhalten, um die Größe des Arrays zu kennen), aber ich muss die Größe nicht an die free-Funktion übergeben. Warum nicht, und kann ich dieselbe Technik in meinen eigenen Funktionen verwenden, damit ich nicht die zusätzliche Variable für die Länge des Arrays mit mir herumschleppen muss?
Antworten
Zu viele Anzeigen?Die ursprüngliche Technik bestand darin, einen etwas größeren Block zuzuweisen und die Größe am Anfang zu speichern und dann der Anwendung den Rest des Blogs zu überlassen. Der zusätzliche Platz enthält eine Größe und möglicherweise Links, um die freien Blöcke zur Wiederverwendung zusammenzufassen.
Es gibt jedoch einige Probleme mit diesen Tricks, wie z. B. schlechtes Cache- und Speicherverwaltungsverhalten. Die Verwendung von Speicher direkt im Block neigt dazu, Dinge unnötig auszulagern, und es entstehen schmutzige Seiten, die die gemeinsame Nutzung und das Copy-on-Write erschweren.
Eine fortgeschrittenere Technik besteht darin, ein separates Verzeichnis zu führen. Es wurden auch exotische Ansätze entwickelt, bei denen Bereiche des Speichers die gleiche Zweierpotenz verwenden.
Im Allgemeinen lautet die Antwort: eine separate Datenstruktur für die Speicherung des Zustands zugewiesen wird.
malloc()
y free()
sind system-/compilerabhängig, so dass es schwer ist, eine konkrete Antwort zu geben.
Weitere Informationen zu dieser anderen Frage .
Um die zweite Hälfte Ihrer Frage zu beantworten: Ja, Sie können, und ein ziemlich häufiges Muster in C ist das folgende:
typedef struct {
size_t numElements
int elements[1]; /* but enough space malloced for numElements at runtime */
} IntArray_t;
#define SIZE 10
IntArray_t* myArray = malloc(sizeof(intArray_t) + SIZE * sizeof(int));
myArray->numElements = SIZE;