问题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-。
答案 0 :(得分:1)
对于您的确切要求我有些困惑,因此我会尽力回答。
如果使用给定的所需大小调用malloc()
,它将尝试分配该大小。如果成功,它将返回给您分配的内存块的地址;如果失败,它将返回NULL
。
请注意,这仅指虚拟内存。在某些系统上,仅在实际寻址内存时才提供物理内存,然后如果事实证明无法满足该请求,该程序将被终止。
已分配块的大小取决于您的要求。实际上,记账和填充可能会更多,但这与您(呼叫者)的事务无关—在您允许访问的范围之外对存储器的任何访问都是未定义的行为,并且可能导致故障。
(我不太了解DMA的来源。)
关于“分段”分配的补充:
如果调用malloc()
以分配大内存块,则C库将分配其虚拟内存的该区域。如果尚未使用它,则必须以一种或其他方式从操作系统请求它。
在Linux下,只要有足够的虚拟内存(=地址空间)并且满足某些其他限制,该请求就会被批准。仅当您写入分配的内存区域时,它们实际上才从RAM的空闲部分分配。但是对于实际使用来说,这是无关紧要的,因为该程序会“立即”执行分配操作(除非分配的内存不如假定的那么大)。
答案 1 :(得分:0)
您可以进行上限二进制搜索,尝试输入0
和SIZE_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。