【发布时间】:2018-01-03 23:52:37
【问题描述】:
我使用两个动态分配内存的变量,并打印内存位置,但它们不是连续的。为什么?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *a = malloc(sizeof(int));
int *b = malloc(sizeof(int));
printf("\n a=%p \t b=%p \n",a,b);
}
我得到的答案(在 Linux 中)是
第一次:
a=0x20a0010 b=0x20a0030
第二次:
a=0x657010 b=0x657030
第三次:
a=0x139e010 b=0x139e030
为什么 a 和 b 变量的内存位置在第 1、2 和 3 次时的确切差异?
这和分页内存有关吗?
我的处理器是 64 位的。
【问题讨论】:
-
这有关系吗?如果你需要连续的地址,你应该使用一个数组。
-
虽然这是误导,但这是一个有趣的问题。没有别的,你可能期望内存位置是连续的
-
您的地址相隔
32字节。如果它们是连续的,你会期望它们相隔4字节(假设sizeof(int) == 4,它似乎通常是这样) -
malloc()分配的不仅仅是请求的字节数,因为它必须在内存块中存储额外的跟踪信息,因此free()知道如何正确释放内存。想想看。您正在分配sizeof(int)字节。如果您不将sizeof(int)作为参数传递给它,您认为free()如何知道释放sizeof(int)字节?该信息必须存储在某个地方,传递给free()的唯一内容是内存指针,因此该信息必须位于内存块本身中。 -
正如@RemyLebeau 所说,让
malloc()只分配一定大小或更大的块也确实更有效率;如果您要求更小的尺寸,它可以升级到这个更大的尺寸