Warum bekomme ich jedes Mal eine Warnung, wenn ich malloc benutze?


110

Wenn ich mallocin meinem Code verwende:

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

Ich bekomme diese Warnung von gcc:

new.c:7: warning: implicit declaration of function malloc  
new.c:7: warning: incompatible implicit declaration of built-in function malloc

Antworten:


224

Sie müssen hinzufügen:

#include <stdlib.h>

Diese Datei enthält die Deklaration für die integrierte Funktion malloc. Wenn Sie dies nicht tun, glaubt der Compiler, dass Sie Ihre eigene Funktion mit dem Namen definieren möchten, mallocund warnt Sie, weil:

  1. Sie deklarieren es nicht explizit und
  2. Es gibt bereits eine integrierte Funktion mit diesem Namen, die eine andere Signatur als die implizit deklarierte hat (wenn eine Funktion implizit deklariert wird, wird angenommen, dass ihre Rückgabe- und Argumenttypen intnicht mit der integrierten Funktion kompatibel sind. in malloc, das a nimmt size_tund a void*) zurückgibt .

5
Terminologie nit: In C. malloc gibt es keine integrierte Funktion, sondern lediglich eine Funktion aus der Standard C-Bibliothek.
Jens

5
@Jens Ich sehe kein Problem darin, Standardbibliotheksfunktionen als integrierte Funktionen zu bezeichnen - und die gcc-Leute anscheinend auch nicht, da in der Fehlermeldung auch das Wort "integriert" verwendet wurde (weshalb ich es getan habe).
sepp2k

7
@ sepp2k Nun, ich tue ein Problem sehen. Die Verwendung ist nicht Standard. Compiler können integrierte Funktionen haben, und in gcc ist möglicherweise malloc integriert. Aber wie ich geschrieben habe, gibt es in C keine eingebauten Funktionen.
Jens

30

Du hast es nicht getan #include <stdlib.h>.


16

Sie müssen die Header-Datei einschließen, die die Funktion deklariert, zum Beispiel:

#include <stdlib.h>

Wenn Sie diese Header-Datei nicht einschließen, ist die Funktion dem Compiler nicht bekannt. Es sieht es also als nicht deklariert an.


10

Machen Sie es sich zur Gewohnheit, Ihre Funktionen in der Hilfe nachzuschlagen.

Die meiste Hilfe für C ist den Unix-Handbuchseiten nachempfunden.

Verwenden von:

man malloc

gibt ziemlich nützliche Ergebnisse.

Googeln man mallocwird dir zeigen, was ich meine.

Unter Unix erhalten Sie auch Vorschläge für verwandte Dinge.


1
Nur wenn Sie bereits wissen, dass die Zeile #include <stdlib.h>in der Inhaltsangabe bedeutet, dass Sie diese in Ihr Programm schreiben müssen.
Mechanische Schnecke

1
Wenn jemand die anderen Antworten hier gelesen hat, weiß er das jetzt.
MikeKulls

0

Neben den anderen sehr guten Antworten möchte ich einen kleinen Trottel machen und etwas behandeln, was in den anderen Antworten noch nicht besprochen wurde.


Wenn Sie unter Linux sind, um malloc()in Ihrem Code zu verwenden,

Das musst du eigentlich nicht #include <stdlib.h> .

(Obwohl die Verwendung von stdlib.hsehr verbreitet ist und wahrscheinlich jedes Nicht-Spielzeug-Programm es so oder so enthalten sollte, da es eine breite Palette nützlicher C-Standard-Bibliotheksfunktionen und Makros bietet)

Sie könnten auch #include <malloc.h>stattdessen.

Beachten Sie jedoch, dass die Verwendung von malloc.hveraltet ist und Ihr Code nicht portierbar ist. Wenn Sie verwenden möchten, malloc()sollten Sie immer und immer (außer aus expliziten Gründen, um etwas anderes zu tun) #include <stdlib.h>.

Die Gründe dafür werden am besten in den Antworten auf diese Frage erklärt:

Unterschied zwischen <stdlib.h> und <malloc.h>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.