私はいくつかの配列に必要なメモリを動的に割り当てるアプリケーションをcで作成しています。私はそれらの配列の多くがゼロ割り当てを必要とすることを知っています。だから、私が彼らに無料で電話するときに問題がありますか?例:free(malloc(0 * sizeof(int)));
?私のアプリケーションはコンパイルされ、マシン上で正常に動作しますが、これに頼ることはできますか?乾杯!c freeall malloc(0)
答えて
malloc(0)
(これは実装定義である)NULLポインタを返すことがあり、またはそれぞれの新しいポインタを返すことができる行われませんあなたがそれを呼び出す時。どちらの場合でも、戻り値はfree
に渡すことが有効です。なぜなら、free(0)
は何もしていないからです。しかし、検出およびISO CとPOSIXの間realloc
と不一致の失敗を扱うといくつかの厄介な問題に、私は強くmalloc
またはrealloc
にサイズ0を渡すためにあなたの決してを助言します。引数の末尾に+1
または|1
を追加するだけで、いつでも呼び出すたびに一意のポインタ(ヌルポインタまたは他のオブジェクトのアドレスとは異なる)を取得できます。
malloc(0)
を使用しないもう一つの理由は、あなたが常にmalloc(0)
が成功した場合にNULLポインタを返すことができるのに対し、障害を検出するためにmalloc
の戻り値をチェックしなければならないということです。これは、size引数が0のエラーでない場合を特殊化する必要があるので、すべてのエラーチェックコードをより複雑にします。
(1回)の結果については、free
に電話することはいつでも可能です。
はい、free(malloc(0))
が動作することが保証されています。さらなる議論のために
することができますfree(malloc(0))
を参照してください。 man malloc
から
:
size
場合は、次に、malloc()
戻りいずれかNULL
、以降 suc- cessfullyfree()
に渡すことができるユニークなポインタ値0
です。
フリー:
ptr
がNULL
ある場合、何も操作が
だから私は 'free()'を安全に呼び出すことができますが、 'malloc()'を呼び出すと、 'if(arr = malloc())){start screaming!}'のように結果をチェックします。 'malloc(0)'が実装に依存する場合、これは失敗します。 – Psyclops
ええ、 'malloc()'が 'NULL'を返すのがエラーだと思うなら、' malloc(0) 'を呼び出すことはできません。 'malloc()'は失敗時に 'errno'を' ENOMEM'にセットするので、代わりにそれをチェックすることができます。 – sverre
ここで 'errno'を使うには、' malloc'を呼び出す前に 'errno'を0に設定しなければなりません。より良いテストは、 'malloc'がnullを返した後にsize引数が0であったかどうかをチェックすることです。この場合、失敗ではありません。 –
- 1. のmallocエラー(C)
- 2. Cプログラミング-Malloc/Free
- 3. fgets malloc c help
- 4. C mallocとfree
- 5. C++ mallocエラー
- 6. のmalloc C
- 7. cのMalloc関数
- 8. c struct、malloc、realloc issue
- 9. C - Mallocとmemcpy(メモリ管理)
- 10. フリーとmallocのVisual C++スレッドセーフ?
- 11. Cでのmalloc()関数
- 12. バスエラー:10. Cコード、mallocの例
- 13. C/C++サイズが0
- 14. C malloc、ポピュレート時のメモリ使用量
- 15. Visual C++のmalloc実装ですか?
- 16. C動的構造体(mallocと空き)
- 17. Objective-Cオブジェクトでmalloc/freeを使用
- 18. CアプリケーションでのMALLOCのリソース消費
- 19. Cのmallocメモリ割り当て方式
- 20. mallocチェックポイント
- 21. Windowsでmalloc(0)がnull以外のアドレスを返すのはなぜですか?
- 22. 文字列終了 - char c = 0 vs char c = '\ 0'
- 23. split malloc mem space
- 24. mallocラッパーコードの問題
- 25. ポインタ、構造体とのmalloc()
- 26. malloc memory corruption、fopen
- 27. ポインタアドレスはmallocの
- 28. memset after malloc
- 29. のmallocメモリは
- 30. mallocとボイドポインタ
malloc(0)は[実装定義](http: //stackoverflow.com/a/2132318/922184)。 – Mysticial
@Mysticial:はい、しかし、返す結果(有効なポインタかNULLのいずれか)を 'free'することはできますか? –
これは配列のゼロ初期化と何が関係がありますか? –