Beste Antwort
Ich gehe davon aus, dass Sie wissen, dass Sie beim Ausführen eines C-Programms drei geöffnete Dateien haben, von denen zwei STDOUT heißen und STDERR, normale Nachrichten gehen in stdout (dh wenn Sie printf aufrufen) und Fehlermeldungen in stderr (wenn Sie beispielsweise fprintf (stderr, …) aufrufen), werden diese beiden (tatsächlich geöffneten Dateien) direkt von Ihrem Betriebssystem verknüpft Das wichtigste Merkmal ist, dass sie umgeleitet werden können, z. B. unter Unix, wenn Sie Folgendes tun: ls | grep file.txt Die Shell leitet stdout in „ls“ und jetzt um Das Ziel für diese Ausgabe ist STDIN im „grep“ -Prozess, sodass grep nach Mustern in diesem Stream usw. suchen kann. Dies ist mächtiges Zeug, viele Unix-Filter (Programme tatsächlich) werden auf diese Weise erstellt, was mächtig ist.
BEARBEITEN: Hinzufügen eines aussagekräftigeren Beispiels Lassen Sie mich eine neue und explizitere Verwendung der Umleitung hinzufügen, damit Sie die Sache anhand eines aussagekräftigeren Beispiels erfassen können. Sehen Sie sich diesen Befehl an:
curl http://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.xz | xzcat – | tar xvf –
Hier beginnt curl, wget aus dem GNU-Projekt herunterzuladen, während curl Daten herunterlädt, die in STDOUT geschrieben werden, aber die Shell hat stdout of curl in stdin von xzat umgeleitet, die Shell erledigt das Leitet das stdout von xzcat in stdin von tar um, und tar beginnt, die Daten zu dekomprimieren, erstaunlich!
Antwort
Zunächst ein allgemeines Prinzip: Egal was Sie tun, malloc()
wird niemals automatisch aufgerufen.
Wenn Sie eine struct
deklarieren, deklarieren Sie einen Typ. Ein Typ für sich. verbraucht zur Laufzeit keinen Speicher.
Wenn Sie eine Variable vom Strukturtyp deklarieren, wird ihr Speicher zugewiesen, jedoch nicht malloc()
. Wenn die Variable lokal ist Für eine Funktion wird normalerweise Speicher dafür auf dem Stapel zugewiesen. Dies ermöglicht teilweise die Rekursivität in C: Jedes Mal, wenn Sie die Funktion aufrufen (auch wenn sie von selbst aufgerufen wird), wird der Stapelzeiger angepasst und Auf dem Stapel wird neuer Speicherplatz für die Lok reserviert Alle Variablen dieser Funktion und jedes Mal, wenn die Funktion beendet wird, wird der Stapel „abgewickelt“, wobei der gesamte Speicherplatz frei wird.
Wenn Sie eine globale Variable deklarieren, wird eine statische Zuordnung dafür vorgenommen der Heap, wenn das Programm gestartet wird, und die Variable bleibt während der Ausführung des Programms verfügbar. Die erforderliche Heap-Größe ist zur Kompilierungszeit bekannt.
Wenn Sie dagegen malloc()
verwenden, wird der Speicher dem Programm zur Laufzeit vom Betriebssystem und dynamisch zugewiesen Sie sind dafür verantwortlich, es mit free()
freizugeben, oder Ihr Programm (insbesondere wenn es sich um ein Programm handelt, das lange Zeit ohne Neustart ausgeführt wird, z. B. eine Dienstanwendung) leidet unter a Speicherverlust, der die Leistung beeinträchtigt und im Extremfall das gesamte Ressourcensystem aushungert. Die Verwendung von malloc()
ist am besten geeignet, wenn entweder a) die erforderliche Speichermenge größer ist, als auf dem Heap oder dem Stapel zugewiesen werden kann, oder b) die erforderliche Speichermenge nicht im Voraus bekannt.