2012-01-10 9 views
2

私はいくつかの配列に必要なメモリを動的に割り当てるアプリケーションをcで作成しています。私はそれらの配列の多くがゼロ割り当てを必要とすることを知っています。だから、私が彼らに無料で電話するときに問題がありますか?例:free(malloc(0 * sizeof(int)));?私のアプリケーションはコンパイルされ、マシン上で正常に動作しますが、これに頼ることはできますか?乾杯!c freeall malloc(0)

+1

malloc(0)は[実装定義](http: //stackoverflow.com/a/2132318/922184)。 – Mysticial

+0

@Mysticial:はい、しかし、返す結果(有効なポインタかNULLのいずれか)を 'free'することはできますか? –

+0

これは配列のゼロ初期化と何が関係がありますか? –

答えて

4

malloc(0)(これは実装定義である)NULLポインタを返すことがあり、またはそれぞれの新しいポインタを返すことができる行われませんあなたがそれを呼び出す時。どちらの場合でも、戻り値はfreeに渡すことが有効です。なぜなら、free(0)は何もしていないからです。しかし、検出およびISO CとPOSIXの間reallocと不一致の失敗を扱うといくつかの厄介な問題に、私は強くmallocまたはreallocにサイズ0を渡すためにあなたの決してを助言します。引数の末尾に+1または|1を追加するだけで、いつでも呼び出すたびに一意のポインタ(ヌルポインタまたは他のオブジェクトのアドレスとは異なる)を取得できます。

malloc(0)を使用しないもう一つの理由は、あなたが常にmalloc(0)が成功した場合にNULLポインタを返すことができるのに対し、障害を検出するためにmallocの戻り値をチェックしなければならないということです。これは、size引数が0のエラーでない場合を特殊化する必要があるので、すべてのエラーチェックコードをより複雑にします。

1

(1回)の結果については、freeに電話することはいつでも可能です。

8

することができますfree(malloc(0))を参照してください。 man mallocから

size場合は、次に、malloc() 戻りいずれかNULL、以降 suc- cessfully free()に渡すことができるユニークなポインタ値0です。

フリー:

ptrNULLある場合、何も操作が

+0

だから私は 'free()'を安全に呼び出すことができますが、 'malloc()'を呼び出すと、 'if(arr = malloc())){start screaming!}'のように結果をチェックします。 'malloc(0)'が実装に依存する場合、これは失敗します。 – Psyclops

+1

ええ、 'malloc()'が 'NULL'を返すのがエラーだと思うなら、' malloc(0) 'を呼び出すことはできません。 'malloc()'は失敗時に 'errno'を' ENOMEM'にセットするので、代わりにそれをチェックすることができます。 – sverre

+1

ここで 'errno'を使うには、' malloc'を呼び出す前に 'errno'を0に設定しなければなりません。より良いテストは、 'malloc'がnullを返した後にsize引数が0であったかどうかをチェックすることです。この場合、失敗ではありません。 –