c - malloc行为解释

标签 c memory-management malloc

我正在测试 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 变量已被释放,因此内存空间被重新使用。 bc 的地址也是合乎逻辑的,因为 ab 没有被释放,所以地址增加了。

而现在,它变得非常奇怪。 我 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/

相关文章:

C - 释放指向指针的指针

c - 在C中,具体类型的指针如何对待所指向的内存空间?

iphone - 使用 Go 为 iPhone 应用程序编写库

c++ - 我在 C 中有相互依赖的 header ,这给了我错误。我怎样才能删除它?

objective-c - AutoreleasePool 没有捕获断点,没有警告,Instruments Leaks 中没有报告

ios - 为什么会有弱者和无主?为什么我们不能总是使用 weak?

c - 使用 malloc 在运行时分配内存时出现段错误

c - C变量中是否有可能 "Turn off"或 "Turn on"波动?

C 宏 : Conditional code based on parameter value?

ios - NSString 和 NSMutableString 内存注意事项