Unterschied zwischen und

Lesezeit: 6 Minuten

Wenn ich benutze malloc In einem C-Programm erhalte ich eine Warnung:

warning: incompatible implicit declaration of built-in function 'malloc' [enabled by default]

kann ich dann einbinden <malloc.h> oder <stdlib.h> loszuwerden warning obwohl es auch ohne geht.

Also habe ich mich gefragt, was der Unterschied zwischen diesen Headern ist und welcher gcc Links, wenn ich nichts einfüge?

(Ich benutze ubuntu 12.04 64-bit mit gcc 4.6.3)

Benutzeravatar von Basile Starynkevitch
Basile Starynkevitch

Das <malloc.h> Header ist veraltet (und ziemlich Linux-spezifisch, auf dem er definiert nicht standardmäßig Funktionen wie Mallinfo(3)). Verwenden <stdlib.h> stattdessen, wenn Sie einfach brauchen malloc(3) und zugehörige Standardfunktionen (z free, calloc, realloc ….). Beachte das <stdlib.h> ist definiert durch C89 (und später) Standards, aber nicht <malloc.h>

Einblick in /usr/include/malloc.h Dort finden Sie einige nicht standardmäßige Funktionen (z malloc_stats(3)etc…) – zusätzlich zu malloc….

Und gcc verlinken Sie keine Header-Dateien, sondern Bibliotheken. Lesen Sie Levines Buch darüber Linker & Loader für mehr.

Wenn Sie keine Header einfügen (und nicht explizit deklarieren malloc selbst, was eine schlechte Idee wäre), malloc wird implizit als etwas zurückgebend deklariert int Wert (was falsch ist). Ich lade Sie ein, zumindest die zu bestehen -Wall Flagge zu gcc bei der Verwendung.

Du könntest auch bestehen -v zu gcc um die eigentlichen beteiligten Programme zu verstehen: cc1 ist der eigentliche Compiler (erzeugt Assemblercode), as der Monteur, ld der Linker und sammeln2 ein internes Dienstprogramm, das den Linker aufruft.

  • Ihr, ich denke, Verlinken war der falsche Begriff. Ich wollte fragen, wie funktioniert gcc finden malloc funktionieren, wenn ich keine Header einfüge?

    – keiner

    19. Oktober 2012 um 11:35 Uhr

  • Verlinken ist der gute Begriff. Aber der Linker kennt nicht die Signatur von C-Funktionen, nur ihre Namen. Nur der eigentliche Compiler (cc1 angefangen von gcc) kümmern sich um die Typsignatur von Funktionen.

    – Basile Starynkevitch

    19. Oktober 2012 um 11:37 Uhr

  • <malloc.h> kann sowohl aktiv (vorhandener Header) als auch veraltet sein (empfohlen, nicht verwendet zu werden)

    – Basile Starynkevitch

    8. November 2015 um 14:47 Uhr

  • Überraschenderweise ist memalign() eine der Nicht-Standard-Funktionen, die in malloc.h deklariert sind. Es ist nicht Teil der C-Standardbibliothek

    – Joel Cunningham

    2. Dezember 2015 um 20:02 Uhr


  • @JoelCunningham: Das ist weil das nur genormte Bezeichnungen sind posix_memalign (POSIX) und aligned_alloc (C11). memalign selbst ist “veraltet und nicht standardisiert”.

    – ShadowRanger

    12. Februar 2016 um 23:26 Uhr

Benutzeravatar von nos
Nr

stdlib.h ist ein Standard-C-Header, der unter anderem die deklariert malloc(), calloc(), free() Funktionen. Dies ist der Header, den Sie einfügen sollten.

malloc.h ist ein nicht standardmäßiger Header, der auf vielen Systemen zu finden ist, wo er oft zusätzliche Funktionen definiert, die spezifisch für die von dieser Plattform verwendete Malloc-Implementierung sind.

Wenn Sie keine davon angeben, gibt es keine Standardeinstellung, aber wenn Sie anrufen malloc() ohne vorherige Deklaration der malloc-Funktion geht C davon aus, dass der Funktionsprototyp ist int malloc();, was oft falsch ist. Zusätzlich zu den Headern verweisen C-Compiler normalerweise auf eine Standardbibliothek, z. B. glibc unter Linux, in der sich die Implementierung von malloc befindet.

Beachten Sie, dass es einen Unterschied zwischen Header-Dateien und Bibliotheken gibt. Header-Dateien deklarieren Dinge wie Strukturen und Funktionsprototypen. Bibliotheken enthalten die Implementierung, den kompilierten Code. Sie verlinken zur Bibliothek, und Sie #include Header-Dateien.

Benutzeravatar von Steve Jessop
Steve Jessop

Die Header deklarieren unterschiedliche Sätze von Funktionen, aber beide deklarieren vorwärts malloc.

Wenn Sie keines von beiden einschließen, haben Sie keinen Prototyp für malloc, daher die Warnung. Aber Sie verlinken trotzdem gegen die gleiche Funktion, weil es nur eine gibt malloc Funktion. Es ist nur an zwei Stellen vorwärts deklariert. Die Forward-Deklarationen sind nicht da, um beim Linken gegen die zu helfen malloc Funktion, sie sind da, damit der Compiler den richtigen Code rund um den Aufruf ausgeben kann, um die Argumente anzugeben und den Rückgabewert zu lesen.

Beachten Sie, dass <malloc.h> ist kein Standard-Include. Ich denke nicht stdlib.h jemals beinhaltet malloc.h auf GCC, aber Sie können sich vorstellen, dass dies der Fall ist, da dies eine Möglichkeit ist, die erforderliche Erklärung abzugeben.

  • Nur um es klarzustellen, es gibt mir keine error aber ein warning. Programm funktioniert gut, ohne dass ich irgendetwas einschließe.

    – keiner

    19. Oktober 2012 um 11:33 Uhr

  • @gokcehan: Sie sollten die Warnung jedoch beachten. Es gibt einen tatsächlichen Fehler, der als Ergebnis des Anrufs auftreten kann malloc ohne einen Prototyp im Geltungsbereich, und die Warnung ist Ihre Verteidigung dagegen. stackoverflow.com/questions/605845/…. Wenn Ihr Programm funktioniert, liegt das nur daran, dass Sie in Bezug auf die Details der Aufrufkonvention dieser Implementierung Glück haben – derselbe Code kann fehlschlagen, wenn er für Linux auf einer anderen CPU kompiliert wird.

    – Steve Jessop

    19. Oktober 2012 um 11:35 Uhr


<malloc.h> ist kein Standard-Header und daher nicht portabel. Der Standard setzt malloc() et al. in <stdlib.h>.

Benutzeravatar von David C
David C.

Andere haben bereits die Unterschiede zwischen und besprochen

Was die Warnung betrifft, wenn keine enthalten ist, so ist dies die Definition, wie C-Funktionen funktionieren. Eine Funktion ohne Prototyp (was Sie haben, wenn Sie keinen eigenen deklarieren und keinen Header mit einschließen) wird als Funktion mit einem behandelt int Rückgabetyp und an nicht spezifiziert Argumentliste.

Der Compiler führt Standardumwandlungen durch (z. B. Float zu Double und andere) und die Funktion wird aufgerufen. Wenn sich die Anzahl der von der Funktion verwendeten Argumente von der übergebenen Anzahl unterscheidet oder wenn die Argumenttypen nach Standardheraufstufungen nicht mit der Implementierung der Funktion kompatibel sind, handelt es sich um ein undefiniertes Verhalten.

Siehe ISO 9899:1999 (C99) §6.5.2.2, § 6:

Wenn der Ausdruck, der die aufgerufene Funktion bezeichnet, einen Typ hat, der keinen Prototyp enthält, werden die ganzzahligen Heraufstufungen für jedes Argument und für Argumente, die einen Typ haben, durchgeführt float dazu befördert werden double. Diese heißen die Standardargument-Promotions. Wenn die Anzahl der Argumente nicht gleich der Anzahl der Parameter ist, ist das Verhalten undefiniert. Wenn die Funktion mit einem Typ definiert ist, der einen Prototyp enthält, und entweder der Prototyp mit Auslassungspunkten (, …) endet oder die Typen der Argumente nach der Heraufstufung nicht mit den Typen der Parameter kompatibel sind, ist das Verhalten undefiniert. Wenn die Funktion mit einem Typ definiert ist, der keinen Prototyp enthält, und die Typen der Argumente nach der Heraufstufung nicht mit denen der Parameter nach der Heraufstufung kompatibel sind, ist das Verhalten undefiniert, mit Ausnahme der folgenden Fälle:

  • ein heraufgestufter Typ ist ein vorzeichenbehafteter ganzzahliger Typ, der andere heraufgestufte Typ ist der entsprechende vorzeichenlose ganzzahlige Typ, und der Wert ist in beiden Typen darstellbar;
  • beide Typen sind Zeiger auf qualifizierte oder nicht qualifizierte Versionen eines Zeichentyps oder void.

Bei Anruf malloc() Ohne einen Prototyp kann dies sehr schlecht werden. malloc() akzeptiert a size_t Argument und gibt a zurück void * Zeiger. Wenn das Ergebnis der Standard-Promotion Ihres Integer-Arguments eine Integer-Größe unterschiedlicher Größe erzeugt size_t, haben Sie ein undefiniertes Verhalten. Und wenn int hat eine andere Größe als void * (z. B. auf 64-Bit-Systemen, wo int ist oft 32-Bit und void * wird 64-Bit sein), wird der zurückgegebene Zeiger durcheinander gebracht.

Benutzeravatar von bmargulies
bmargulies

Um den Unterschied zu erfahren, sollten Sie deren Inhalt selbst lesen.

Standardmäßig liest gcc beides nicht.

Wenn Sie sie lesen, werden Sie sehen, dass sie erklären malloc anders.

1409500cookie-checkUnterschied zwischen und

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

Privacy policy