5

これが私のプログラムです:

#include <stdio.h>
#include <stdlib.h>

main(){
   char *p1, *p2, *p3, *p4;

   p1 = (char*)malloc(10);
   p2 = (char*)malloc(10);
   p3 = (char*)malloc(16);
   p4 = (char*)malloc(32);

   printf("p1 points at: %d\n", p1);
   printf("p2 points at: %d\n", p2);
   printf("p3 points at: %d\n", p3);
   printf("p4 points at: %d\n\n", p4);

   system("PAUSE");
}

これにより、PCで次の出力が生成されます。

p1 のポイント: 6492080

p2 ポイント: 6492104

p3 ポイント: 6492128

p4 ポイント: 6492152

そのため、malloc が割り当てる各メモリ空間は、割り当てられたバイト数に関係なく、さらに 24 バイトずつ開始されます。何故ですか?私はあなたの助けに感謝します!

4

3 に答える 3

5

の正確な動作はmalloc、特定のインペンション(compiler / libc / OS)によって決まります。アドレスを印刷することにより、プログラムは未定義の動作に従事します。

使用しているコンパイラ、使用しているOS、アーキテクチャ、使用しているlibcのバージョンを指定して質問の範囲を狭めた場合、その実装についてより具体的な回答を提供できる可能性があります。なぜ数は24です。

私の推測では、実装ではmalloc、メモリの各ed領域は、8の倍数のアドレスで開始する必要があり、8バイトのオーバーヘッドもあります。

編集: p4の後にp5を作成するために再度呼び出した場合malloc、パターンは確実に続行できないため、「mallocが割り当てる各メモリスペースは、割り当てられたバイト数に関係なく、さらに24バイト開始します」というステートメント。は偽です。

于 2012-10-20T15:20:12.033 に答える
3

intanとsomevoid*またはポインタが同じサイズであるという保証はありませんchar*(私のDebian / Linux / AMD64システムでは、int-sは32ビットですが、ポインタは64ビットです)。を含め<stdint.h>て使用することをお勧めしますintptr_t

の実装でmallocは、ハウスキーピングの目的で、割り当てられたゾーンの数バイト前に予約される場合があります。そして、mallocshoudは常に十分に整列されたポインターを返します(整列の制約はコンパイラー、ランタイム、およびプロセッサー固有です)。時間内に結果のシーケンスの増加を返すという保証はまったくありませんmalloc(特に、数百万の呼び出しが数百万の呼び出しとmalloc混合されている実際のプログラムでは、このような長時間実行されるプロセスでメモリの断片化freeが発生する可能性があります)。

そして、p5 = malloc(10120);後にを追加すると、とp4の間に24バイトの距離が表示されないことは間違いありません。成功した場合、その結果が以前の結果のエイリアスではないことが保証されるため、少なくとも距離が必要です。 32バイトの(32バイトのチャンクを含む)。p5p4mallocp5p4

ほとんどの場合、標準Cライブラリは、mallocいくつかの低レベルのプリミティブ、通常は連続する仮想メモリページをフェッチするためのシステムコールの上に実装されます。Linuxでは、これらのシステムコールは多くの場合mmap(2)(おそらくは)であり、Linuxシステムはほとんどが自由ソフトウェアであるため、mallocのMusl Libc実装などの実装を実際に調査および改善できます(より一般的なGNUlibc実装はおそらくより複雑です理解する)。したがって、Linuxに切り替えることで詳細を学ぶことができます。sbrk(2)mallocmalloc

malloc理論的には、の実装は常に失敗します。実際にmallocは、成功する可能性がありますが、常に失敗のケースをテストする必要があります。

もちろん、ほとんどの実装は、可能であれば、実装でfree最近-dメモリゾーン(システムコールなし)を気にし、再利用します。ヒープを作成して効率的にする方法は困難です(非常に優れたものにしたい場合は、まだ研究対象になる可能性があります)。 freemallocmallocfree

mallocのウィキペディアページを読むことをお勧めします。

于 2012-10-20T15:22:38.897 に答える