10

callocnumそれぞれのサイズのメモリのブロックを割り当てますsize

void * calloc ( size_t num, size_t size );

メモリ内の配列にスペースを 割り当てるnum要素の配列にメモリブロックを割り当てます。各要素のサイズはバイト長で、すべてのビットをゼロに初期化します。

対照的に、mallocサイズのメモリの1つのブロックを割り当てますsize

void * malloc ( size_t size );

メモリブロック の割り当てサイズバイトのメモリのブロックを割り当て、ブロックの先頭へのポインタを返します。


両方の間に違いはありますか(によるゼロ初期化を除くcalloc)?

num実際には返されるメモリ領域も隣接しているため、callocはメモリのブロックによって正確に何を意味しますか。

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

4

7 に答える 7

4

申し訳ありませんが、違いはありません(ただし、メモリはゼロになっています)

Calloc()は、配列のサイズと1つの単一セルの次元という2つの異なる値が手元にある配列で使用する場合に役立ちます。返される領域のメモリはどちらの場合も連続しており、おそらく同じデータ構造を使用してそのような領域を追跡します(ただし、これは実装に依存します)

于 2012-09-19T07:58:22.023 に答える
2

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

あなたがそれをこのようにすると:

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

'sz'は、期待どおりにならない場合があります。その後、mallocは呼び出し元の予想よりもはるかに少ない割り当てを行いますが、呼び出し元は、返された領域を十分な大きさで処理することになります。これにより、ヒープオーバーフローが発生し、通常のセキュリティへの影響がすべて発生します。

于 2012-09-19T07:55:35.627 に答える
1

calloc私はどのように機能するかを調べようとしました

私は以下のコードを見つけます

/* 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);
}

callocとmallocの間に大きな違いはないことがわかります。

ここでglibcのコードを参照できます

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

于 2012-09-19T12:39:54.870 に答える
0

唯一の本当の違いは、による0の初期化calloc()です。

なぜcalloc()ブロックサイズとブロック数で機能するのにmalloc()機能しないのか、私にはわかりませんでした。

于 2012-09-19T07:55:26.860 に答える
0

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

于 2012-09-19T07:58:58.797 に答える
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;
}

実装方法がまったく異なる場合がありますが、機能的には上記と同等であることに注意してください。メモリの「内部レイアウト」に違いはなく、連続したブロックが得られます。

于 2012-09-19T08:03:08.297 に答える
0

はい。Calloc()サイズごとにnブロックを割り当てsize_t size、次にサイズの各ブロックsize_t sizeをゼロに割り当てます。

于 2015-07-30T05:27:25.310 に答える