mallocを使用するたびに警告が表示されるのはなぜですか?


110

mallocコードで使用する場合:

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

私はこの警告を受けgccます:

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

回答:


224

追加する必要があります:

#include <stdlib.h>

このファイルには、組み込み関数の宣言が含まれていますmalloc。そうしないと、コンパイラーは名前を付けた独自の関数を定義したいと考え、malloc次の理由で警告を出します。

  1. あなたはそれを明示的に宣言せず
  2. 暗黙的に宣言されたものとは異なるシグネチャを持つその名前の組み込み関数がすでに存在します(関数が暗黙的に宣言されている場合、その戻り値と引数の型はと見なされますがint、これは組み込み関数と互換性がありませんin mallocはaを受け取り、a size_tを返しますvoid*

5
用語nit:Cの組み込み関数のようなものはありません。mallocは、単に標準Cライブラリの関数です。
イェンス

5
@Jens標準ライブラリ関数を組み込みとして参照することに問題はありません。エラーメッセージにも「組み込み」という単語が使用されているため、gccの人もそうではありません(これが私が行った理由です)。
sepp2k 2012年

7
@ sepp2kまあ、私がやるの問題を参照してください。使用法は非標準です。コンパイラは組み込み関数を持つことができ、gccはmalloc組み込みを持つことができます。しかし、私が書いたように、Cには組み込み関数はありません。
イェンス


16

たとえば、関数を宣言するヘッダーファイルをインクルードする必要があります。

#include <stdlib.h>

このヘッダーファイルを含めない場合、関数はコンパイラに認識されません。したがって、それは宣言されていないと見なします。


10

ヘルプで関数を調べる習慣をつけてください。

Cのほとんどのヘルプは、UNIXのマニュアルページでモデル化されています。

使用:

man malloc

かなり有用な結果が得られます。

グーグル man malloc、私が何を言っているかがます。

UNIXでは、関連するものについても適切です。


1
#include <stdlib.h>概要の行がプログラムに記述しなければならないことを既に知っている場合にのみ。
メカニカルカタツムリ

1
誰かがここで他の答えを読んだ場合、彼らは今それを知るでしょう。
MikeKulls 2013

0

他の非常に良い答えに加えて、少しひっくり返して、他の答えでまだ議論されていないことをカバーしたいと思います。


Linuxの場合malloc()、コードで使用するには、

実際に行う必要はあり ません#include <stdlib.h>

(ただし、 stdlib.hは非常に一般的ですが、多種多様な便利なC標準ライブラリ関数およびマクロを提供するため、おそらくすべての非おもちゃプログラムにはどちらの方法でも含める必要があります)

#include <malloc.h>代わりにすることもできます。

ただし、の使用malloc.hは推奨されておらず、コードを移植できなくなることに注意してください。使用したいmalloc()場合は、常に使用する必要があります(明示的に理由がある場合を除いて)#include <stdlib.h>

の理由、この質問に対する回答で最もよく説明されています。

<stdlib.h>と<malloc.h>の違い

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.