malloc如何区分占用相同空间的不同类型?

Dav*_*vid 0 c malloc memory-management

假设在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;
}
Run Code Online (Sandbox Code Playgroud)

由于malloc接收要分配的字节数,因此对malloc的两次调用看起来完全相同.malloc如何知道实际分配16个字节来存储两个整数数组并且只为一个长度分配8个字节?

为清晰起见进行编辑:基于以下假设,存储这两个不同的阵列将需要为每个阵列提供不同的空间量.但是,malloc似乎每次在此程序中保留相同的空间量.然而,对于长度不同于longs 的数据类型的数组,正确地确定了数组大小.

有人可以帮我识别内存的这种理解中的缺陷,还是指出malloc/libc在后台做的事情?以下是我正在进行的假设

  • 在该系统的每个存储器地址中,最多可存储一个长度
  • mem[idx]指MEM的地址加上IDX的偏移量,并在存储器中该地址不能指向数据中的另一个项目的中间(因此mem1[0]不能参考的下半字mem1mem1[1]不能然后参考高位字)
  • 当生成一个整数数组时,这个系统上的两个整数不会打包成一个整数

小智 7

malloc如何区分占用相同空间的不同类型?

它没有.

由于malloc接收要分配的字节数,因此对malloc的两次调用看起来完全相同.malloc如何知道实际分配16个字节来存储两个整数数组,并且只为一个长度分配8个字节

它只能使用您传递它的大小作为其参数.但是,您的示例和/或理解存在缺陷 - 使用指定的sizeof值,两个调用都将分配8个字节.(即,2 * sizeof(int)其是2 * 4sizeof(long),这是1 * 8).