C:malloc()、free(),然后又是 malloc() 的工作方式总是一样吗?

Moh*_*iur 1 c malloc free memory-management cpu-architecture

我尝试在具有不同处理器和主内存大小的一些不同机器上运行此代码。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    // your code goes here

    int *a, i;

    a = (int *)malloc(10*(sizeof(int)));

    for(i = 0; i < 10; i++)
    {
        a[i] = i*i;
    }

    free(a); 

    a = (int *)malloc(10*(sizeof(int)));

    for(i = 0; i < 10; i++)
    {
        printf("%d\n",a[i]);
    }

    free(a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然而,在所有机器中它都会生成相同的输出:

0
1
4
9
16
25
36
49
64
81
Run Code Online (Sandbox Code Playgroud)

我的问题是:变量“a”是否应该始终分配使用相同的内存位置来执行?

从理论上讲,可能不是强制性的。如果我的理解是正确的:“a”的每个 malloc 都可以分配不同的基地址。

然而,现代计算机在实践中实际发生了什么?

DaK*_*nOb 5

现代内存分配器有多种性能优化。它们有多个可用内存桶,每次您请求一定数量的字节时,它们都会查看并确定最佳的可用内存区域。一些内存分配器保留一个指向您最后一次分配的指针,因此如果您需要另一块相同大小的内存(经常发生这种情况),它们会给您相同的一块,这样他们就不必寻找新的一块,这需要时间。

您可以尝试两次调用 to malloc(),然后调用 to free(),然后malloc()再次调用 to ,看看会发生什么。