callocとmalloc

callocを使用してメモリブロックを割り当てると、割り当てられた領域はゼロに初期化されます。 対照的に、 mallocは割り当てられたメモリブロックの内容には影響しません。つまり、ガベージ値が含まれています。 メモリの内容は予測不能であり、プログラミングエラーがこれらの内容のリークを引き起こす可能性があるため、これは潜在的にセキュリティリスクになる可能性があります。

比較表

callocとmallocの比較表
カロック malloc
関数それぞれ「サイズ」バイトの「n要素」を保持するのに十分な大きさのメモリ領域を割り当てます。 また、メモリの内容をゼロに初期化します。「サイズ」バイトのメモリを割り当てます。
引数の数21
構文void * calloc(number_of_blocks、size_of_each_block_in_bytes);void * malloc(size_in_bytes);
割り当てられたメモリの内容割り当てられた領域はゼロに初期化されます。割り当てられたメモリの内容は変更されません。 つまり、メモリに予測不能な値またはガベージ値が含まれています。 これにはリスクが伴います。
戻り値voidポインター(void *)。 割り当てが成功すると、メモリブロックへのポインタが返されます。 メモリの割り当てに失敗すると、NULLポインターが返されます。voidポインター(void *)。 割り当てが成功すると、メモリブロックへのポインタが返されます。 メモリの割り当てに失敗すると、NULLポインターが返されます。

構文と例

malloc()

 void * malloc(size_t size); 

sizeバイトのメモリを割り当てます。 割り当てが成功すると、割り当てられたメモリへのポインタが返されます。 それ以外の場合、 NULLが返されます。 例:

 / * int型の15個の要素を持つ配列にメモリを割り当てます。 * / int * ptr = malloc(15 * sizeof(int)); if(ptr == NULL){/ *メモリを割り当てることができなかったため、エラーを出力して終了します。 * / fprintf(stderr、 "メモリを割り当てることができませんでした\ n"); exit(EXIT_FAILURE); } / *割り当てに成功しました。 * / 

mallocでは、必要なメモリのバイト数を計算し、それを引数としてmallocに渡す必要があることに注意してください。

calloc()

 void * calloc(size_t nelements、size_t bytes); 

それぞれsize bytes nelementsを保持するのに十分な大きさの連続したメモリブロックを割り当てbytes 。 割り当てられた領域はゼロに初期化されます。 上記の例では:

 / * int型の15個の要素を持つ配列にスペースを割り当て、ゼロに初期化します。 * / int * ptr = calloc(15、sizeof(int)); if(ptr == NULL){/ *メモリを割り当てることができなかったため、エラーを出力して終了します。 * / fprintf(stderr、 "メモリを割り当てることができませんでした\ n"); exit(EXIT_FAILURE); } / *割り当てに成功しました。 * / 

calloc(m、n)は次と同じです

 p = malloc(m * n); if(p)memset(p、0、m * n); 

Calloc、Malloc、およびReallocを説明するビデオ

このビデオチュートリアルでは、メモリ割り当て関数malloccallocおよびrealloc 、およびメモリ割り当てcalloc関数reallocについて説明します。

セキュリティに関する考慮事項

一般的に、 mallocではなくcallocを使用することをお勧めします。 mallocを使用する場合、割り当てられたメモリの内容は予測できません。 プログラミングエラーにより、これらのメモリコンテンツが意図しないが非常に脆弱な方法でリークする可能性があります。 このようなリークの良い例は、OpenSSLのHeartbleed脆弱性です。その基本的なメカニズムはこのXKCDコミックで説明されており、さらに技術的な詳細はこのブログ投稿にあります。

実行速度

callocは、割り当てられたメモリ領域を初期化する余分なステップがあるため、mallocよりも少し遅いです。 ただし、実際には速度の違いは非常に小さく、無視できます。

関連記事