0

次のプログラムが x86_64 システムで実行されているとします。

int main() {
    //sizeof(int) == 4
    //sizeof(int*) == 8
    //sizeof(long) == 8

    // I would like 2 distinct memory locations to hold these two integers
    int* mem1 = (int*)malloc(2 * sizeof(int));
    mem1[0] = 1;
    mem1[1] = 2;

    //I would like 1 distinct memory location to hold this one long
    long* mem2 = (long*)malloc(1 * sizeof(long));
    mem2[0] = 3;

    free(mem1);
    free(mem2);
    return 0;
}

割り当てるバイト数を受け取るためmalloc、malloc への両方の呼び出しはまったく同じように見えます。malloc は、2 つの整数配列を格納するために実際に 16 バイトを割り当て、1 つの long 配列には 8 バイトのみを割り当てることをどのように認識しますか?

わかりやすくするために編集: 次の仮定に基づいて、これら 2 つの異なる配列を格納するには、それぞれに異なる量のスペースが必要になります。ただし、malloc は、このプログラムで毎回同じ量のスペースを予約しているように見えます。ただし、配列のサイズは、s とは異なる長さのデータ型の配列に対して正しく決定されますlong

誰かがこのメモリの理解の欠陥を特定するのを手伝ってくれますか、または malloc / libc がバックグラウンドで行っていることを指摘できますか? ここに私が操作している仮定があります

  • このシステムの各メモリ アドレスには、最大 1 つの long を格納できます。
  • mem[idx]mem のアドレスに idx のオフセットを加えたものを参照し、そのアドレスはメモリ内の別のアイテムの途中にあるデータをmem1[0]指すことはできません (したがって、の下位ハーフワードをmem1参照mem1[1]することはできず、上位ワードを参照することもできません)
  • 整数の配列が作成されるとき、このシステムでは 2 つの整数が 1 つの long にパックされません。
4

4 に答える 4

7

malloc は、同じスペースを占有する異なるタイプをどのように区別しますか?

そうではありません。

malloc は割り当てるバイト数を受け取るため、malloc の両方の呼び出しはまったく同じように見えます。malloc は、2 つの整数配列を格納するために実際に 16 バイトを割り当て、1 つの long 配列には 8 バイトのみを割り当てることをどのように知っていますか?

引数として渡したサイズのみを使用できます。あなたの例や理解には欠陥がありますが、指定されたsizeof値を使用すると、両方の呼び出しで8バイトが割り当てられます。(つまり、2 * sizeof(int)どちらが2 * 4sizeof(long)、どちらが です1 * 8。)

于 2013-08-23T20:58:41.603 に答える
2

char質問者は、それが C のメモリの基本単位であることを認識していなかったため、混乱していました。彼のプラットフォームでは、( an を格納するのに必要なsizeof(int)の数) は 4 です。したがって、2 つの を格納するには、次のように割り当てる必要があります。、または 8 バイト。charintint2*sizeof(int)

longがメモリの基本単位 (および) である仮想の世界では、 sizeof(long) == 82 つの を格納するにintは、実際にはパッキングするか、16 バイトを割り当てる必要がありますが、それは C の動作方法ではありません。

于 2013-08-23T22:43:26.353 に答える