0

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

我试图找到动态分配的内存大小,但没能做到。很多人在stackoverflow上写过,你找不到动态内存的大小。这是真的吗?

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

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

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

4

2 回答 2

1

我对你到底问什么有点困惑,所以我尽量回答。

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

    请注意,这仅指虚拟内存。在某些系统上,仅在实际寻址内存时才提供物理内存,如果结果无法满足请求,则终止程序。

  2. 分配的块的大小是您所要求的。实际上,簿记和填充可能会更多一些,但这不关您(调用者)的业务 - 任何对您被允许访问之外的内存的访问都是未定义的行为,并且可能导致故障。

  3. (我真的不明白 DMA 的来源。)

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

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

在 Linux 下,只要有足够的虚拟内存(=地址空间)并且满足某些其他限制,就会批准此请求。仅当您写入分配的内存区域时,它们实际上是从 RAM 的空闲部分分配的。但是对于实际使用,这无关紧要,因为程序“好像”分配立即发生(除非可用的内存没有假设那么多)。

于 2019-05-21T09:50:37.493 回答
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 的 非详尽列表 C 编译器对大于 PTRDIFF_MAX 字节的对象进行破坏的方式

于 2019-05-21T10:19:07.967 回答