C Struktur und Speicherbelegung
Wenn Sie Speicherplatz für Speicher, wie Sie sagen, wenn Sie brauchen, um mehr Speicherplatz zugeordnet? Gibt es einen check oder so, die Sie tun können, auf Ihre neue Speicher, um sicherzustellen, dass es tut, OK? ( zugewiesenen Speicher für eine struct).
Weil das, was ich denke ist, dass eine struct ist eine festgelegte Menge an Daten und auch wenn ich pass es um viel, es sollte nie brauchen, mehr als die Größe der Struktur korrekt?
Es ist nicht klar, was Sie gefragt haben. Reden Sie mit
malloc(sizeof(struct T)) weist immer genau genug Speicherplatz für die Daten in einem struct T. Nicht mehr, aber auch nicht weniger. Keine Notwendigkeit zu prüfen. Wenn das "system memory", d.h. der heap nicht ausreicht, um zu ermöglichen, reservieren, die viel Speicher malloc NULL zurück, die sollte überprüft werden.
ja malloc und @PeterSchneider meinen code gerade angefangen immer langsamer und langsamer, so dass ich Frage mich, ist es, weil ich die struct zu lange auf dem heap ?
Sicher, wenn Sie reservieren GByte Daten-können Sie Ihre Maschine austauscht, ungenutzten Speicher auf der Festplatte, um freien Arbeitsspeicher für die Zuweisungen. Das hätte aber zu viele Zuweisungen. Es ist gute Praxis, free() den Speicher, wenn nicht mehr benötigt.
malloc
zum reservieren von Speicherplatz für ein einzelnes struct-Objekt? Tut struct foo *ptr = malloc(sizeof *ptr);
Adresse, was Sie zu tun versuchen?malloc(sizeof(struct T)) weist immer genau genug Speicherplatz für die Daten in einem struct T. Nicht mehr, aber auch nicht weniger. Keine Notwendigkeit zu prüfen. Wenn das "system memory", d.h. der heap nicht ausreicht, um zu ermöglichen, reservieren, die viel Speicher malloc NULL zurück, die sollte überprüft werden.
ja malloc und @PeterSchneider meinen code gerade angefangen immer langsamer und langsamer, so dass ich Frage mich, ist es, weil ich die struct zu lange auf dem heap ?
Sicher, wenn Sie reservieren GByte Daten-können Sie Ihre Maschine austauscht, ungenutzten Speicher auf der Festplatte, um freien Arbeitsspeicher für die Zuweisungen. Das hätte aber zu viele Zuweisungen. Es ist gute Praxis, free() den Speicher, wenn nicht mehr benötigt.
InformationsquelleAutor user2861799 | 2014-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nur mit einem einfachen
struct
Sie brauchen nicht mehr Speicher als für ihn die Zeit vergeht. Erstellen Sie einfach diestruct
verwenden Sie es und reinigen Sie es falls erforderlich. Wenn Sie die dynamische Zuweisung von Ihrer Struktur (dh: mitmalloc
), dann testen Sie den Wert der Zeiger-auf-Struktur, die Sie erstellen, und sehen, ob esNULL
. Wenn esNULL
, dann die memory allocation failed", und Sie können entweder wiederholen oder Abbrechen weitere Operationen (sprich: Ausgang auf Fehler).Nun, wenn Sie brauchen, um erstellen Sie ein array mit dynamisch zugewiesenen Strukturen, und Sie haben Sie alle, und mehr brauchen, würden Sie wahrscheinlich am besten ab, mit einem etwas komplizierteren Ansatz, wie eine dynamisch zugewiesene verkettete Liste von Strukturen. Ein gutes Beispiel finden Sie im Abschnitt "Informationsquellen" weiter unten. Außerdem habe ich ein link zu einem etwas Verwandte Frage, die ich beantwortet über die Speicherbelegung in C. Es hat einige gute Beispiele, die möglicherweise auch helfen, klar, bis dieses Thema für Sie.
Referenzen
<http://www.thegeekstuff.com/2012/08/c-linked-list-example/>
<https://stackoverflow.com/questions/16021454/difference-between-declared-string-and-allocated-string>
// Static allocation, no cleanup required
ist ein wenig irreführend, da die statischen, hat diese eine Besondere Bedeutung in C, von denen keine hier gilt. staticStruct ist nicht statisch, sondern automatisch.Angenommen, Sie brauchen, um passieren, dass reservierte Struktur, um Ihr Programm für mindestens 5-Funktionen zu nutzen
Es spielt keine Rolle, wie viele Funktionen brauchen, es zu benutzen. Wenn Sie übergeben entweder die struct selbst, ein Zeiger auf die struct, die letztere Methode bevorzugt werden, haben Sie eine Kopie der argument-sowieso (also: als Wert übergeben werden, im Gegensatz zu der übergabe by reference). Wenn Sie einige Beispiel-code, du würdest kümmern weitergeben, ich könnte weiter kommentieren.
Nur um zu klären: Wenn Sie einen Zeiger übergeben, Sie übergeben Sie eine Kopie des Arguments, das ist die Zeiger. Sie nicht übergeben Sie eine Kopie des struct.
Durch "static" ich beziehe mich auf die variable gespeichert ist in das code-segment auf dem stack statt am heap. Nicht ganz 100% genau, aber ausreichend für die Frage auf der hand. Ich habe einen zusätzlichen Verweis auf eine separate post von mir, der erklärt das Recht gründlich.
InformationsquelleAutor DevNull