次のプログラムが 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 にパックされません。