在运行时返回的最大大小Malloc函数是多少?

时间:2019-05-21 09:41:40

标签: c memory-management dynamic-memory-allocation memory-pool

问题1:MALLOC可以分配的最大内存是多少? 问题2:Malloc是分配用户已请求的所有内存还是仅分配所需的内存。

(注意:我不是在指物理可用内存,而是为了了解这一点,如果我要求Malloc分配很大的内存块,那么它将分配整个内存(这很愚蠢),否则它将分配大量内存,然后在处理过程中增加大小)

我试图找到动态分配的内存大小,但是没有做到这一点。 而且很多人都说过堆栈溢出,找不到动态内存的大小。

我尝试了这些步骤,这对于动态内存分配是不正确的。

int *var=malloc((sizeof(int)*10));
printf("Size of Alloacted Memory=%ld ", (char *)(var+1) - (char *)var);

没有错误,但输出不正确。

我还遇到了一些信息,即动态内存在运行时完全依赖于编译器,因此无法预测。

malloc是分配用户请求的全部内存,还是编译器限制DMA分配所需块的块,然后在需要时提供更多的as-n-。

2 个答案:

答案 0 :(得分:1)

对于您的确切要求我有些困惑,因此我会尽力回答。

  1. 如果使用给定的所需大小调用malloc(),它将尝试分配该大小。如果成功,它将返回给您分配的内存块的地址;如果失败,它将返回NULL

    请注意,这仅指虚拟内存。在某些系统上,仅在实际寻址内存时才提供物理内存,然后如果事实证明无法满足该请求,该程序将被终止。

  2. 已分配块的大小取决于您的要求。实际上,记账和填充可能会更多,但这与您(呼叫者)的事务无关—在您允许访问的范围之外对存储器的任何访问都是未定义的行为,并且可能导致故障。

  3. (我不太了解DMA的来源。)

关于“分段”分配的补充:

如果调用malloc()以分配大内存块,则C库将分配其虚拟内存的该区域。如果尚未使用它,则必须以一种或其他方式从操作系统请求它。

在Linux下,只要有足够的虚拟内存(=地址空间)并且满足某些其他限制,该请求就会被批准。仅当您写入分配的内存区域时,它们实际上才从RAM的空闲部分分配。但是对于实际使用来说,这是无关紧要的,因为该程序会“立即”执行分配操作(除非分配的内存不如假定的那么大)。

答案 1 :(得分:0)

您可以进行上限二进制搜索,尝试输入0SIZE_MAX之间的值:

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

_Bool try_alloc(size_t Val)
{
    void *p = malloc(Val);
    free(p);
    return !!p;
}
int main()
{

    printf("SIZE_MAX=%zu\n", SIZE_MAX);
    size_t it=0;
    size_t count=SIZE_MAX, step, first=0;
    while (count > 0) {
            it = first;
            step = count / 2;
            it += step;
            if (try_alloc(it)) {
                first = ++it;
                count -= step + 1;
            }
            else
                count = step;
    }
    printf("%zu\n", first); //found upper bound
    void *p; p= malloc(first-1); printf("test_alloc=%p\n", p); free(p);
}

实际上,malloc实现不应让您分配超过 PTRDIFF_MAX。参见Pascal Cuoq's A non-exhaustive list of ways C compilers break for objects larger than PTRDIFF_MAX bytes