【问题标题】:How does malloc distinguish between different types that both take up the same space?malloc 如何区分占用相同空间的不同类型?
【发布时间】:2013-08-27 00:43:15
【问题描述】:

假设以下程序在 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 怎么知道实际分配 16 个字节来存储两个整数数组,而只为一个 long 分配 8 个字节?

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

有人可以帮我找出对内存的理解中的缺陷,或者指出 malloc / libc 在后台做的事情吗?以下是我正在操作的假设

  • 在此系统上的每个内存地址,最多可以存储一个 long
  • mem[idx]指的是mem的地址加上idx的偏移量,并且该地址不能指向内存中另一项中间的数据(所以mem1[0]不能指mem1和@987654327的低半字@然后不能指高字)
  • 当创建一个整数数组时,在这个系统上两个整数不会被打包成一个长整数

【问题讨论】:

  • 它根本没有这种类型的区分。因此,它返回void* 并需要 byte 计数的原因。类型区分是你的工作;不是malloc()
  • 是什么让你认为malloc 为两个整数数组分配了 16 个字节?
  • 由于int只有4个字节,存储2个整数数组只需要8个字节。在这两种情况下,它都会分配 8 个字节,并且不关心您最终要在其中存储什么类型。
  • malloc() 没有线索。 sizeof() 知道区别。
  • 你似乎认为long是内存的基本单位,使用少于sizeof(long)字节来存储一条数据就构成了“打包”。这是不正确的; char 是内存的基本单位,而不是long。在您的平台上,int 存储在四个 chars 内存中。

标签: c memory-management malloc


【解决方案1】:

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

没有。

由于 malloc 接收到许多要分配的字节,所以对 malloc 的两个调用看起来完全相同。 malloc 怎么知道实际分配 16 个字节来存储两个整数数组,而只为一个 long 分配 8 个字节

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

【讨论】:

    【解决方案2】:

    提问者很困惑,因为他没有意识到char 是C 中的基本内存单元。在他的平台上,sizeof(int)(这是存储int 所需的chars 的数量) ) 是4。因此,要存储两个ints,需要分配2*sizeof(int),即8个字节。

    long 是内存的基本单元(和sizeof(long) == 8)的假设世界中,存储两个ints 确实需要打包或分配16 个字节,但这不是C 的方式有效。

    【讨论】:

      【解决方案3】:

      你总是可以用一些printf 语句来测试你的论文。对于您的示例,请使用:

          printf("\nsizeof int is %d, long is %d", sizeof(int), sizeof(long));
      

      你会看到:2*sizeof(int) == 1*sizeof(long)

      【讨论】:

        【解决方案4】:

        malloc doesn't,但是当你调用mem[0]mem[1] 时,编译器知道mem (int *mem) 是什么类型,所以当你调用mem[1] 时,它会知道要增加多少mem访问此数组的第二个元素的指针。区别发生在编译器方面。

        【讨论】:

          猜你喜欢
          • 2016-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多