Malloc Speicher auf Null setzen?

Lesezeit: 4 Minuten

Benutzeravatar von bemühtmac
bemühungmac

Angesichts dieses C-Codes, der mit gcc 4.3.3 kompiliert wurde

#include <stdio.h>
#include <stdlib.h>

 
int main(int argc, char * argv[])
{
 
    int * i;
    
    i = malloc(sizeof(int));
    
    printf("%d\n", *i);
    return 0;
 
}

Ich würde erwarten, dass die Ausgabe das ist, was sich im Speicher befindet, den malloc() zurückgibt, aber stattdessen ist die Ausgabe 0. Setzt malloc den zurückgegebenen Speicher auf Null? Wenn ja warum?

  • Was Sie erwarten, ist der Fall. Es gibt aus, was sich im Speicher befand, den malloc() zurückgibt, was zufällig null war.

    – David Schwartz

    30. August 2011 um 14:26 Uhr

malloc selbst löscht den Speicher nicht, aber viele Betriebssysteme nullen den Speicher, den Ihr Programm aus Sicherheitsgründen anfordert (um zu verhindern, dass ein Prozess auf potenziell vertrauliche Informationen zugreift, die von einem anderen Prozess verwendet wurden).

  • Ich sollte erwähnen, dass nichts im Standard steht verhindert malloc davon abhält, seinen Speicher auf Null zu setzen. Aus Effizienzgründen ist es normalerweise nicht, aber dies ist nicht vorgeschrieben.

    – paxdiablo

    25. Oktober 2009 um 22:26 Uhr

  • Beachten Sie auch, dass zwar neuer Speicher aus dem Betriebssystem auf Null gesetzt werden kann, es aber wahrscheinlich ist, dass Ihre Anwendung Speicher wiederverwertet, den sie zuvor verwendet hat nicht genullt werden. Denken Sie also nicht einmal daran, sich darauf zu verlassen 🙂

    – bdonlan

    25. Oktober 2009 um 22:30 Uhr

  • Völlig richtig, Bdonlan. Um diese Malloc-X-Bytes zu sehen, schreiben Sie einige Informationen hinein, geben Sie sie frei, malloc-X-Bytes erneut und lesen Sie sie. Es werden wahrscheinlich die gleichen Daten sein.

    – Zan Luchs

    16. März 2011 um 18:00 Uhr

  • Im Debug-Modus löscht malloc normalerweise den Speicher. Stellen Sie sicher, dass Sie im Release-Modus kompilieren.

    – Yochai Timmer

    5. Februar 2012 um 16:31 Uhr

  • @YochaiTimmer: Gute Debug-Mallocs füllen den Speicher mit einem Schutzwert, z VC++2005 verwendet 0xFD, 0xDD und 0xCD.

    – tc.

    12. Juni 2012 um 18:32 Uhr

Das malloc() -Funktion setzt den zugewiesenen Speicher nicht auf einen bestimmten Wert. Wenn Sie sicherstellen möchten, dass der Speicher Null ist, verwenden Sie calloc() oder gleichwertig. Andernfalls erhalten Sie das, was vorher da war (was in Ihrem Fall null sein könnte).

  • Ich würde das erwarten, wenn es nicht konstant 0 wäre. Warum sollte ich immer wieder einen Wert erhalten, der konstant 0 ist?

    – Bemühungmac

    25. Oktober 2009 um 21:53 Uhr

  • Sie führen das gleiche Programm immer wieder auf die gleiche Weise aus und erwarten unterschiedliche Ergebnisse? Obwohl malloc() Es ist nicht garantiert, dass der Speicher auf Null gesetzt wird. Das Betriebssystem erledigt die gleiche Arbeit, um Ihr Programm zu laden und zum Laufen zu bringen. Ihr Laufzeitbibliothekscode tut dasselbe, um den Heap-Speicher einzurichten und mit der Ausführung Ihres Codes zu beginnen. Wie in einer anderen Antwort erwähnt, gibt Ihnen das Betriebssystem wahrscheinlich neue Speicherseiten, die auf einen bestimmten Wert initialisiert wurden, um verschiedene Prozesse voneinander zu isolieren.

    – Greg Hewgill

    25. Oktober 2009 um 22:07 Uhr

  • Ihr Programm fordert neuen Speicher vom Betriebssystem an. Das Betriebssystem löscht Speicher, wenn es zum ersten Mal einem Prozess zugewiesen wird. Versuchen Sie, zufällige Werte einzugeben, geben Sie das Stück frei () und weisen Sie ein anderes zu.

    – Nr

    25. Oktober 2009 um 22:32 Uhr

Der Wert im zugewiesenen Speicher ist offiziell undefiniert. C99 sagt: The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. malloc() kann tun, was es will, einschließlich Nullstellen. Dies kann absichtlich geschehen, ein Nebeneffekt der Implementierung sein, oder Sie haben einfach viel Speicher, der zufällig 0 ist.

FWIW unter OS X mit Apples gcc 4.0.1 kann ich nicht dazu bringen, dass es nicht 0 herauskommt, selbst wenn ich viele Zuweisungen mache:

for( idx = 0; idx < 100000; idx++ ) {
    i = (int *) malloc(sizeof(int));
    printf("%d\n", *i);
}

  • Versuchen Sie, *i auf einen Wert ungleich Null zu setzen, i freizugeben, dann erneut zu mallocieren und zu sehen, was Sie bekommen.

    – Stefan Kanon

    25. Oktober 2009 um 22:50 Uhr

  • Jeglicher Speicher, der Ihrem Prozess zum ersten Mal zugewiesen wird, wird aus Sicherheitsgründen auf Null gesetzt, sodass Sie den Speicher nicht mallocieren und herausfinden können, welche Informationen ein anderer Prozess darin geschrieben hat.

    – gnasher729

    21. Januar 2015 um 19:04 Uhr

  • @ gnasher729 Dies kann ein bestimmter C-Compiler tun, aber es gibt ihn keine Garantie dies ist der Fall und sollte nicht darauf verlassen werden.

    – Schwern

    21. Januar 2015 um 19:11 Uhr

Benutzeravatar von Adisak
Adisak

Malloc muss keinen Speicher füllen. Aus Performance-Gründen machen die Release-Versionen oft nichts mit Speicher. Eine “sichere” Bibliothek kann eine Malloc-Implementierung haben, die den Speicher löscht. Es ist Sache des Bibliotheksimplementierers. Es gibt einige gängige Muster, die von den Debug-Bibliotheken verschiedener Compiler in den Speicher gefüllt werden, die in diesem Stackoverflow-Thema erläutert werden.

Sie können sich definitiv nicht darauf verlassen, dass es 0 ist. Mallocieren Sie ein größeres Stück und legen Sie es ab, um es zu sehen.

Benutzeravatar von Wai Ha Lee
Wai Ha Lee

Ob seine int; int=0; oder int=00000000; es wird den gleichen Platz im Speicher einnehmen. printf fängt oft die erste 0 als Nullterminator ab, unabhängig davon, was sonst noch in der Zeichenfolge steht. Wenn Sie Zeichenfolgenkomparatoren verwenden und 0 ein Platzhalter ist, würde ich Ihnen empfehlen, ALLES außer 0 für diesen Platzhalter zu verwenden, da Zeichenfolgen-basierte Bibliotheken wirklich scheiße sind. Probieren Sie F aus und schreiben Sie dann das Steuerelement in sich selbst, indem Sie je nach Bedarf einen Nullbegriff oder einen Zeilenumbruch einfügen. Dies ist viel tragbarer.

1432940cookie-checkMalloc Speicher auf Null setzen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy