私はいくつかの配列に必要なメモリを動的に割り当てるアプリケーションを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. C mallocとfree
- 2. fgets malloc c help
- 3. のmallocエラー(C)
- 4. Cプログラミング-Malloc/Free
- 5. C++ mallocエラー
- 6. のmalloc C
- 7. C++ malloc():メモリ破損
- 8. cのMalloc関数
- 9. c struct、malloc、realloc issue
- 10. C malloc構造体実装
- 11. Cでのmalloc()関数
- 12. C - Mallocとmemcpy(メモリ管理)
- 13. C++でのベクトルのMallocエラー
- 14. モジュラス除算をC、Malloc(フリー)
- 15. Malloc in C - 戻り値
- 16. Cのmalloc関数のセグメンテーションフォールト
- 17. バスエラー:10. Cコード、mallocの例
- 18. C - mallocと構造体、セグメンテーションフォールバック
- 19. Mallocエラー:push_back VectorのOpenCV/C++
- 20. Segfault in Cプログラム、mallocコール
- 21. フリーとmallocのVisual C++スレッドセーフ?
- 22. cでのmallocの使用
- 23. Segfault C構造のmalloc中
- 24. objective-c metadataOutputRectOfInterestForRect戻り値{{0、0}、{0、0}}
- 25. mallocとptr =(int *)malloc(100 * sizeof(int))
- 26. Cのmallocメモリ割り当て方式
- 27. C動的構造体(mallocと空き)
- 28. C、ポインタ(またはポインタへのポインタ?)、**、malloc
- 29. C動的割り当てmalloc struc
- 30. Visual C++のmalloc実装ですか?
malloc(0)は[実装定義](http: //stackoverflow.com/a/2132318/922184)。 – Mysticial
@Mysticial:はい、しかし、返す結果(有効なポインタかNULLのいずれか)を 'free'することはできますか? –
これは配列のゼロ初期化と何が関係がありますか? –