Frage

Vor diesem C-Code kompiliert mit gcc 4.3.3

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


int main(int argc, char * argv[])
{

    int * i;

    i = (int *) malloc(sizeof(int));

    printf("%d\n", *i);
    return 0;

}

Ich würde erwarten, dass die Ausgabe, was zu sein war im Speicher, dass malloc () zurückkehrt, sondern der Ausgang ist 0. Ist malloc den Speicher eliminiert er zurückkehrt? Wenn ja, warum?

War es hilfreich?

Lösung

malloc selbst Null Speicher nicht, aber es viele Betriebssysteme werden den Speicher, die Ihr Programm Anfragen aus Sicherheitsgründen auf Null (einen Prozess zu verhindern potenziell sensible Informationen zugreifen, die von einem anderen Prozess verwendet wurden).

Andere Tipps

Die malloc() Funktion setzt nicht den zugewiesenen Speicher auf einen bestimmten Wert. Wenn Sie den Speicher, um sicherzustellen, wollen Null ist, Verwendung calloc() oder gleichwertig. Andernfalls erhalten Sie, was auch immer, was vorher war (was in Ihrem Fall könnte Null sein).

Der Wert in dem zugewiesenen Speicher ist offiziell nicht definiert. C99 heißt es: 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, es einschließlich eliminierte. Dies kann absichtlich, ein Nebeneffekt der Umsetzung, oder Sie können nur eine Menge Speicher, die 0 sein geschieht.

FWIW auf OS X mit Apples gcc 4.0.1 Ich kann es nicht machen kommen nicht 0 sogar viele Zuteilungen zu tun:

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

Malloc muss nicht Speicher füllen. Aus Performance-Gründen nicht die Release-Versionen oft nichts mit dem Gedächtnis. Eine „sichere“ Bibliothek kann eine malloc Implementierung haben, die Speicher löscht. Es liegt an der Bibliothek Implementierer. Es gibt einige gemeinsame Muster, die durch verschiedene Compiler Debug-Bibliotheken in den Speicher gefüllt sind, die erklärte in diesem Thema Stackoverflow.

Sie können auf jeden Fall nicht davon abhängen 0 zu sein. malloc einen größeren Brocken und Dump es zu sehen.

Ob sein int; int = 0; oder int = 00000000; sein Gehen, den gleichen Platz im Speicher zu übernehmen. die printf wird fängt oft die erste 0 als Nullabschluss unabhängig davon, was sonst in der Zeichenfolge ist. Wenn Sie String Komparatoren verwenden und 0 ist ein Platzhalter würde ich empfehlen Sie etwas verwenden, aber 0 für diese Platzhalter als String basierte Bibliotheken wirklich saugen. Versuchen F und schreiben dann die Kontrolle an sich selbst null Begriff oder Newline Einfügen als zu sein braucht es viel mehr tragbar sein wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top