2

この質問は、mallocとcallocの違いの重複としてマークされている可能性があることは知っていますが、それでも質問したいと思います。

callocがメモリブロックを初期化することは知っていますが、ここでの私の質問はその部分に焦点を当てていません。

私の質問は

mallocの定義は、指定されたサイズのメモリのブロックを割り当てることを示しています。

そしてcallocは、それぞれが同じサイズのメモリの複数のブロックを割り当てると言います。

1ブロックのメモリと複数ブロックのメモリのこの割り当ては、2つの間の本当の違いですか?

callocで実行できるmallocを使用して同じことができると思うからです。

例えば ​​:

int *ptr;
ptr=(int *) malloc(100 * (sizeof(int)));

int *ptr;
ptr=(int *) calloc(100,sizeof(int));

intに必要なメモリの100倍を割り当てることになります。

4

7 に答える 7

7

callocメモリをゼロで埋めます。

p=calloc(n, m); 

と同等です

p=malloc(n*m); 
memset(p, 0, m * n);

したがって、割り当てられたメモリをゼロに設定する場合は、を使用して2回malloc計算するn*mか、一時変数を使用する必要がcallocあります。

編集:ISO C標準を読んだところ、の実装がオーバーフローcallocかどうか、つまりC99標準n*mの定数を超えているかどうかをチェックする必要がある場所が指定されていないことがわかりました。SIZE_MAX

于 2012-02-09T15:01:27.320 に答える
6

あなたはあなたのコード例で正しいです...によって指し示されている実際のメモリはptr同じサイズになります(つまり、100個のintオブジェクトのヒープ上の配列)。他の人が言及しているように、への呼び出しcallocは実際にはそのメモリをゼロにしmallocますが、-asは単にそのメモリへのポインタを提供し、メモリにはすべてゼロが含まれる場合と含まれない場合があります。たとえば、別のオブジェクトからリサイクルされたメモリを取得した場合、への呼び出しにmallocは以前の使用時の値が引き続き含まれます。したがって、メモリを「クリーン」であるかのように扱い、デフォルト値で初期化しないと、プログラムで予期しない動作が発生することになります。

于 2012-02-09T15:07:35.270 に答える
4

はい、主な違いは上記のとおりです。また、オペレーティングシステムのメモリ割り当ての観点から、calloc()はmalloc()よりも低速です。

malloc()は、プログラムがmalloc()に触れるまで、ポインタが実際のメモリに触れないことを返します。一方、calloc()はRAMを備えたメモリです。

于 2012-02-09T15:20:43.767 に答える
3

callocまた、とは異なり、ゼロを含むようにメモリブロックを初期化しますmalloc

于 2012-02-09T14:59:47.973 に答える
3

これはこのサイトで以前に言及されていますが、他の回答から判断すると、繰り返す価値があると思います。2つの整数を乗算するとオーバーフローが発生する可能性があり、その場合は

ptr = malloc(num*size);

おそらく望ましい結果が得られないでしょう(そしておそらく後のセグメンテーション違反になります)。これらの状況では、を優先する必要があります(ただし、新しく割り当てられたメモリをゼロに初期化する calloc(num,size)という事実が気になる場合は、mallocを呼び出す前にオーバーフローをテストすることもできます)。calloc()

于 2012-02-09T15:35:07.203 に答える
0

2つの主な違いは、callocがメモリブロックをゼロに初期化するのに対し、mallocが作成したメモリブロックにはガベージ値が含まれることです。

したがって、コードの不確実性を回避するために、mallocの代わりにcallocを使用する方が適しています。

于 2015-08-08T03:55:57.373 に答える
0

=== mallac( )関数とcalloc()関数について次の違いがわかります===

初期化:
malloc()は、割り当てられたメモリをクリアして初期化しません。
calloc()は、割り当てられたメモリをゼロで初期化します。

Syntex:

void *malloc(size_t size);                   // syntex for malloc() function
void *calloc(size_t num, size_t size);       // syntex for calloc() function

// example
ptr = malloc(num*size);   // for malloc() function
ptr = calloc(num,size);   // for calloc() function

引数:
malloc()構文を検討する場合、引数は1つだけです。
calloc()構文を検討する場合、2つの引数を取ります。

メモリ割り当ての方法::
malloc()関数は、使用可能なヒープから目的の「サイズ」のメモリを割り当てます。
calloc()関数は、「num*size」に等しいサイズのメモリを割り当てます。

于 2019-06-23T06:01:02.283 に答える