Rückgabewert
Ein Verweis auf den Startpunkt der zugewiesenen Region wird von der Alloca () -Methode zurückgegeben. Das Skript verhält sich auf undefinierbare Weise, wenn die Zuweisung zu einem Stapelüberlauf führt.
Einige Bestätigungen
Posix.1-2001 liefert diese Methode nicht. Es ist bekannt, dass die Alloca ().2 und 4bsd. Es ist in 4 dokumentiert.3BSD -manuelle Webseite. Die GNU -Variante wird von Linux verwendet.
Erläuterung
Die Funktion alloca () hängt vom Kompilierprogramm sowie vom Zielsystem ab. Im Gegensatz zur Verwendung von Malloc (3) plus kostenlos kann die Verwendung in einigen Szenarien (3) effizienter gestaltet werden (3). Unter bestimmten Umständen kann es auch die Raumverwaltung in Programmen, bei denen LongJMP (3) oder SiglongJMP eingesetzt wird (3). Es wird jedoch nicht angewiesen, es zu konsumieren.
Angenommen, der von alloca () zugewiesene Speicher ist im Stapelrahmen reserviert. Wenn die Methode -Rückgabe irgendwie durch einen Funktionsaufruf an LongJMP (3) oder SiglongJMP übersprungen wird, wird der Speicher sofort freigegeben (3). Frei (3) Speicher, die Alloca () zugeteilt hat, sollte nicht versucht werden! Alloca () -Anrufe werden häufig mit einem Inline -Skript von GCC (1) übersetzt.
Käfer
Wenn der Stack -Frame möglicherweise nicht erweitert wird, scheint es keine Fehlernachricht zu geben. Wenn die Anwendung versucht, den nicht zugewiesenen Speicher nach einer verpfuschten Platzierung zu verwenden, ist sie qualifiziert, ein SigsegV -Signal zu erhalten. Da dieser von Alloca () zugewiesene Stapelspeicher in der Mitte des Region für die Methodenparameter auf mehreren Plattformen auf dem Stapel angezeigt wird, darf Alloca () nicht in der Liste der Parameter eines Methodenaufrufs verwendet werden.
Beispiel 01
Beginnen wir mit unseren ersten Beispielen für die Verwendung der Alloca () -Funktion von C. Zunächst müssen wir eine C -Datei mit dem Berührungsanweis im aktuellen Arbeitsverzeichnis des Kali Linux -Systems erstellen. Danach können Sie versuchen, es in jedem Editor Ihrer Wahl zu öffnen, um ein C -Skript darin hinzuzufügen. Wir verwenden den VIM -Editor, um das „Allocex“ zu öffnen.c ”Datei.
In der leeren Datei haben wir den folgenden Code hinzugefügt. Dieser Code begann mit dem „stdio.H ”Kopfzeile, um den Standardeingangs- und Ausgangsstrom im Programm zu verwenden. Die „Alloca.H -Header wurde verwendet, um die Alloc () C -Funktion in diesem Code zu verwenden. Dieser Code enthält eine einzelne Main () -Funktion, die eine ganzzahlige Variable mit dem Namen „Nummer“ initialisiert hat, die mit dem Speicher von Größe 4 zugewiesen wurde.
Die „für“ -Schloop wurde initialisiert und verwendet, um den Wert der Variablenzahl um 1 in jedem Index zu erhöhen. Die nächste "für" -Schloop wurde verwendet, um jeden Indexwert der variablen Zahl unter Verwendung der Funktion für printf () anzuzeigen. Dieser Code wurde hier abgeschlossen. Wir haben es gespeichert und es ist bereit für die Zusammenstellung.
Jetzt haben wir diese C -Datei mit dem GCC -Compiler zusammengestellt und seine Objektdatei mit dem Namen "Allocex" erstellt.OUT ”im selben Arbeitsverzeichnis, ich.e., "Arbeiten".
Danach haben wir die neu gemachte Objektdatei dieses Code in der “ausgeführt.“./" Anweisung. Die Ausgabe hat insgesamt 4 Werte für die jeweilige Variable angezeigt, i.e., Größe 4 Speicherzuweisung zur Variablenzahl.
Lassen Sie uns die Iterationsnummer innerhalb der Schleife „für“ ändern, ich.e., Wechseln Sie 4 zu 5. Der folgende Code wurde aktualisiert. Sparen wir es, bevor wir es zusammenstellen.
Wir haben den geänderten Code mit dem GCC -Compiler zusammengestellt, um auch seine Objektdatei zu überschreiben.
Bei der Ausführung haben wir den Segmentierungsfehler. Es liegt daran, dass wir die variable Größe auf 5 initialisiert haben und die "verwendet haben"<” sign to iterate the variable “Number” up to 5 which are a total of 6 memory locations, i.e., should be a total of 5.
Beispiel 02
Nehmen wir ein weiteres Beispiel, um den regelmäßigen Speicher dem Zeigerstapel zuzuweisen. Wir haben dieselben Header mit der Hinzufügung des „stdlib.H ”Kopfball. Die main () -Methode wurde mit der Erklärung einiger Variablen und eines Zeigers eingerichtet. Die Anweisungen für printf- und scanf werden verwendet, um die Eingabenummer vom Benutzer anzuzeigen und abzurufen, während die Funktion alloca () den Speicher der Zeigervariablen „Nummer“ unter Verwendung dieser bestimmten Nummer zuteilt, die von einem Benutzer hinzugefügt wurde. Wenn der Speicher der Variablen „Nummer null ist“, i, i, ich.e., Kein Speicher zugewiesen, dann zeigt der printf () eine mit ihm verbundene Fehlermeldung an. Außerdem beendet die Funktion der Exit (0) dieses Programm.
In der Schleife „für“ verwendet die Funktion printf, um die aktuelle Indexnummer anzuzeigen, und fordert Sie auf, den Wert für einen bestimmten Index mithilfe der SCANF -Funktion einzugeben. Unabhängig von dem Wert, den Sie hinzugefügt haben, wird er durch die Indexnummer erhöht und in der Variablen „Summe“ gespeichert. Die Funktion printf () wird die "Summe" aller Iterationen angezeigt.
Wir haben es zusammengestellt und seine Objektdatei erstellt.
Hat seine Objektdatei ausgeführt und sie hat nach der Größe der Speicherzuweisung gefragt, ich.e., 4. Insgesamt 4 Werte wurden vom Benutzer hinzugefügt und vom Programm zusammengefasst und unten angezeigt:
Abschluss
Hier geht es um die Verwendung der Alloca () -Funktion. Sie sehen.