【发布时间】: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