ごとに:
calloc(20, sizeof(int))
malloc(20 * sizeof(int))
20個の整数にメモリを割り当てます。
malloc()
&calloc()
は、仮想または物理的に連続したスペースを割り当てますか?
C は、マシンに物理アドレス空間と仮想アドレス空間の両方があるとは言いません。
あなたが知っているのは、ポインタを取得し、言語の演算子によって定義されているように、それらを連続的にインデックス化/逆参照できることだけです。
その際、ハードウェアが仮想アドレスを物理アドレスに再マップする必要があるか、アドレス指定された場所の内容を返信する誰かに電子メールを送信する必要があるかどうかは、実装によって定義されます。
スペースが物理的に連続しているかどうかは、開発しているプラットフォーム、MMU、および OS によって異なります。
事実上、それは常に継続的です。
calloc であるか malloc であるかは、違いはありません。
どちらも連続した仮想メモリを割り当てます。ここで、ページングが仮想メモリ管理として使用されるシステムを実行しているとします。最初の 10 ワードはページ フレームの最後に割り当てられ、最後の 10 ワードは別のページ フレームの先頭に割り当てられます。物理ページの割り当ては、実装ではなくカーネルに依存します{m|c}alloc()
。これらは、システム コールを介して追加のメモリを要求するだけです ( brk()
、を参照mmap()
)。物理ページ フレームの割り当ては必ずしも連続しているとは限らないため、割り当ての一部が 1 つのページに収まり、その部分が別のページに収まることになります。
ほとんどの場合、データがページの境界を越えるかどうかを気にする必要はありません。