我正在测试 malloc 以了解它的行为,经过一些操作后我发现了一些奇怪的东西。
我用同一个变量做了 3 次不同的测试。
首先,我已经一个一个地分配和释放了我的 3 个变量:
char * a = malloc(10 * sizeof(char));
printf("\na = %p\n", a);
free(a);
char * b = malloc(10 * sizeof(char));
printf("b = %p\n", b);
free(b);
char * c = malloc(10 * sizeof(char));
printf("c = %p\n\n", c);
free(c);
这个显示:
a = 0xd34010
b = 0xd34010
c = 0xd34010
逻辑上,显示相同的地址,内存空间被回收。
然后,我 malloc 我的 3 var,然后 free :
printf("Alloc 3 times and then free :\n");
a = malloc(10 * sizeof(char));
printf("\na = %p\n", a);
b = malloc(10 * sizeof(char));
printf("b = %p\n", b);
c = malloc(10 * sizeof(char));
printf("c = %p\n\n", c);
free(a); free(b); free(c);
它显示我:
a = 0xd34010
b = 0xd34030
c = 0xd34050
a
是合乎逻辑的,因为最后一个 c
变量已被释放,因此内存空间被重新使用。 b
和 c
的地址也是合乎逻辑的,因为 a
和 b
没有被释放,所以地址增加了。
而现在,它变得非常奇怪。 我 malloc a,然后 b,free a,malloc c 和 free b 和 c:
printf("Alloc, free, alloc :\n\n");
a = malloc(10 * sizeof(char));
printf("a = %p\n", a);
b = malloc(10 * sizeof(char));
printf("b = %p\n", b);
free(a);
c = malloc(10 * sizeof(char));
printf("c = %p\n", c);
free(b); free(c);
结果是:
a = 0xd34050
b = 0xd34030
c = 0xd34050
我的问题是:为什么 a
等于 0xd34050 而不是 0xd34010?为什么 b
的地址低于 a
的地址?
最佳答案
因为这就是在您使用的特定环境中实现内存分配的方式。这听起来可能有点过头了,但是拥有这样的例程的全部意义在于它们可以为您记账;你还有更重要的事情要做!
关于c - malloc行为解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21435972/