2012-09-19 13 views
9

callocサイズsizeのそれぞれ、メモリのnumブロックを割り当てる:mallocとcallocによって割り当てられたメモリブロックレイアウトの違いはありますか?

void * calloc (size_t num, size_t size);

メモリ に配列するためのスペースを割り当て、それらの各サイズNUM要素のアレイのためのメモリのブロックを割り当てすべてのビットをゼロに初期化します。対照的に

mallocサイズsizeのメモリの一つのブロック割り当て:

void * malloc (size_t size);

メモリブロックを割り当てる を指すポインタを返す、メモリのサイズのバイトのブロックを割り当てブロックの始め。


callocによってゼロ初期化を除く)の両方との間の違いがありますか?

callocは、実際にはnumブロック単位のメモリを意味し、返されるメモリ領域は連続しています。

私はいくつかの違いがあると思いますが、そうでなければ、これらのメソッドに2つの異なるインターフェースを定義することはあまり意味がありません。

+0

はい、私はメモリが連続していないと考えてみることさえできませんでした。つまり、用語は、メモリのnブロックが誤っているということですか? –

+0

@AvantikaSkはい、それは間違っています。 – nos

+1

実際には、callocはサイズnの要素の配列を格納するのに適した単一のメモリブロックを割り当てます。ほとんどの実装では、callocはmallocを呼び出し、メモリをゼロにします。私は彼らが偶然に2つの異なるプロトタイプを持っていると思います。そして、callocがメモリをゼロにするので、それらは異なっています。 –

答えて

1

実際には同じことをします。 callocの利点は、必要なメモリ量を決定するのに必要な乗算を実行するときに、優れた実装がオーバーフロー検出を実行することです。

あなたはそれをこのような何か場合:

void * 
calloc(size_t nmemb, size_t size) 
{ 
    size_t sz = nmemb * size; 
    void *res = malloc(sz); 

を「SZ」はあなたはそれがあることを期待するものになってしまうかもしれません。 mallocは、呼び出し元が予想したよりもはるかに少ない割り当てを行いますが、呼び出し元は返された領域を十分に大きく扱うことになります。これによりヒープオーバーフローが発生し、通常はセキュリティ上の影響があります。配列の大きさと1つのセルの大きさ:あなたが手に2つの異なる値を持つ配列でお使いの場合

0

実際の唯一の違いは0の初期化とcalloc()です。

なぜcalloc()はブロックサイズとブロック数で動作しますが、malloc()はそれほど明確ではありません。

+0

この回答は何ですか?回答が何を言っても、OPによってQにすでに言及されています。 –

+1

@Alsそれは、 "これらのメモリは、callocの" 0 "初期化メモリからどのように離れているのでしょうか? "唯一の違いは唯一の違いは、' calloc() 'で0の初期化が行われていることです。他の違いはないことを認識しています。 – glglgl

4

申し訳ありませんが、違います(ただし、メモリがゼロにされる)

はcalloc()が便利になることはできません。返される領域のメモリはどちらの場合も連続しており、おそらく同じ領域を追跡するために同じデータ構造を使用します(実装依存)。

+0

私はcalloc(4,1)を使用する場合、1つのインスタンスですべての4バイトに値を割り当てることはできますか? は次のようになります。char * ptr =(char *)calloc(4,1); * ptr = <4バイトすべてを満たす値> これを実行することは可能で安全ですか? –

+0

返されたポインタがnullでない場合、それは可能で安全ですか?割り当てられた領域が少なくとも4バイトであることが保証されています。注意:calloc/mallocの戻り値は決してキャストしないでください(C言語)。 – Jack

+0

Plus:割り当てられた領域に値を代入したい場合は、mallocよりも遅いcallocを使用しないでください(初期化のため)。あなたが本当にゼロ化を必要とする場合にのみcallocを使用する – Jack

0

これらはどちらもまったく同じです。 Callocは、0で初期化するので、割り当てたいサイズのブロック数を指定する必要があります。基底構造はまったく同じです。

0

は、あなたはかなりのものとしてcalloc()と考えることができます:それは異なっ完全に実装されるかもしれないが、それは上記の機能的に等価であることを

void* calloc(size_t nmemb, size_t size) 
{ 
    const size_t nbytes = nmemb * size; 
    void *p = malloc(nbytes); 
    if(p != NULL) 
    memset(p, 0, nbytes); 
    return p; 
} 

注意。メモリの「内部レイアウト」には違いはありません。連続したブロックが得られます。

1

私はcallocは、私はあなたがのcallocとmalloc関数の間には大きな違いはありません見ることができるコード

/* We use this function occasionally since the real implementation may 
    be optimized when it can assume the memory it returns already is 
    set to NUL. */ 
void * weak_function 
calloc (size_t nmemb, size_t size) 
{ 
    /* New memory from the trivial malloc above is always already cleared. 
    (We make sure that's true in the rare occasion it might not be, 
    by clearing memory in free, below.) */ 
    size_t bytes = nmemb * size; 

#define HALF_SIZE_T (((size_t) 1) << (8 * sizeof (size_t)/2)) 
    if (__builtin_expect ((nmemb | size) >= HALF_SIZE_T, 0) 
     && size != 0 && bytes/size != nmemb) 
    return NULL; 

    return malloc (bytes); 
} 

の下に見つける

をどのように機能するかを見つけることを試みました。

あなたがここでのglibcのコードをbrouseでき

http://sourceware.org/git/?p=glibc.git;a=blob;f=elf/dl-minimal.c

0

はい.What Calloc()それはnはゼロに続いサイズsize_t sizeの各ブロックをサイズsize_t size &のそれぞれをブロック割り当てで行います。

関連する問題