2009-07-09 8 views
2

Mir ist bewusst, dass es in C am besten ist, den Rückgabewert malloc() nie zu übertragen. Ich habe gelesen, dass der Compiler davon ausgeht, dass malloc() einen Int zurückgibt, wenn Sie stdlib.h nicht enthalten. Natürlich würde es einen Fehler erzeugen, wenn Sie implizit ein int zu etwas zuweisen würden, das kein int ist, aber dieser Fehler könnte durch eine explizite Umwandlung verdeckt werden - daher die Gefahr, explizit malloc() zu werfen.Warum nimmt der Compiler an, dass malloc einen int zurückgibt?

Für jede Funktion, die ich erstellt habe, wenn die Funktion nicht existiert, dann wird der Compiler mir das sagen. Warum nimmt der Compiler an, dass malloc() Int zurückgibt, auch wenn Sie stdlib.h nicht enthalten? Sollte nicht malloc() nur undefined bleiben, bis Sie stdlib.h einschließen?

Antwort

7

Wenn der Compiler keine Deklaration für irgendeine aufgerufene Funktion (nicht nur für malloc) gesehen hat, wird angenommen, dass es extern ist und eine int zurückgibt. Die meisten Compiler, die ich verwendet habe, geben nur eine Warnung, keinen Fehler, es sei denn, Sie erhöhen die Warnstufe.

Dies geht zurück auf die frühen Tage von C, ich denke nicht, dass dies in C99 erlaubt ist.

@ Michael Kommentar: Sie scheinen richtig zu sein, nach K & R (Seite 72):

Wenn ein Name, der in einem Ausdruck nicht zuvor erklärt auftritt und wird durch eine linke Klammer gefolgt, es Wird der Kontext als Funktionsname deklariert, wird davon ausgegangen, dass die Funktion ein int zurückgibt und nichts über ihre Argumente angenommen wird.

+2

Eigentlich bin ich ziemlich sicher, dass der Compiler keine Annahmen über die Anzahl der Parameter einer nicht deklarierten Funktion macht. Es ist, als ob du es als int foo (...) erklärst, vorausgesetzt, dass das möglich ist (was ich nicht denke, da Varargs in Standard C mindestens einen Parameter benötigt). Ich habe jedoch nicht meine Kopie von Harbison und Steele bei mir, also könnte ich mich deswegen irren. –

+1

Nein, es ist so, als ob es als 'int foo() 'deklariert wäre - was eine Funktion mit noch nicht spezifizierter (aber definierter!) Anzahl von Argumenten ist; und nicht 'int foo (void)' - was eine Funktion ohne Argumente ist; oder 'int foo (...)' - was, wie du sagst, nicht gültig ist. –

0

Dies ist die Standardeinstellung für jede Funktion.

Mein Compiler sagt mir, wenn ich keine Funktion definiert habe, dass int testFunction() nicht definiert ist.

0

Alle Funktionen werden standardmäßig als int zurückgegeben, sofern nicht anders angegeben.

Siehe here.

+0

Ihr Link ist kaputt. – cpburnz

1

Wie @Burkhard sagte, es ist die Standardeinstellung. Der Compiler spuckt eine Warnung aus, wenn Sie keinen Prototyp für die Funktion definiert haben, und nimmt an, dass die Funktion einen int zurückgibt. Dann, wenn Sie wirklich nicht definiert haben, wird der Linker derjenige sein, der Ihnen einen sofortigen Abbruchfehler gibt.

Verwandte Themen