如何在c中找到内存分配的最大限制

how to find the maximum limit of Memory Allocation in c

我想确定我可以在计算机中分配的最大内存限制是多少。这是我为此任务编写的代码:

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

int main() {
    int j;
    int *primes;
    int i ;

    int limit = 2147483647;

    primes = malloc(sizeof(int) * limit);
    for (i = 0; i < limit; i++)
    {
        primes[i] = 1;
    }
    return 0;
}

如何确定不命中不试可以分配多少内存?我在这个例子中分配了最大的 int 大小。但是程序崩溃了。 此示例中实际分配了多少内存?

你的代码是错误的,原因有很多,比如

  • 假设最大尺寸(针对平台/环境)最不可能是真实的,不太便携。
  • 假设 malloc() 提供部分分配(直到可用内存) 这又是错误的。

    引用 C11 标准,第 §7.22.3.4 章,(强调我的

    The malloc function returns either a null pointer or a pointer to the allocated space.

    因此,要么完全成功(分配了确切的请求内存量)要么完全失败(return 空指针),没有trade-off 喜欢可用内存或您可能假设的任何东西的部分成功。

  • 您没有检查 malloc() 是否成功,导致可能 null-pointer 取消引用。

  • 您无法实际检查分配的成功/失败

我相信,您需要 getrlimit() 和家人来实现您的目标。特别感兴趣的点是 RLIMIT_DATA 作为 resource 值。

也就是说,

1. "I have allocated the maximum int size in this example"

无论如何,这似乎与 malloc() 和家庭的限制无关。

2. "But the program crashes"

这很可能是 undefined behavior 的结果。在您的代码中,您直接取消引用 returned 指针,但未成功检查 malloc()。很可能 malloc() 失败并 return 编辑了 NULL,取消引用导致 UB。

malloc() 允许失败,在这种情况下它 returns a NULL-pointer 不分配任何内存 。它始终是 all-or-nothing 分配。它要么成功并分配请求大小的完整内存块,要么失败,返回 NULL-pointer 而没有分配单个字节。

至于知道有多少内存可用 - 这真的取决于环境:OS 你是什么 运行 这是 16 位、32 位、64 位内存架构?

例如,如果您 运行 在 Windows 10 上,您可以使用 GlobalMemoryStatusEx() 设施(有关详细信息,请参阅 MSDN:GlobalMemoryStatusEx())。

Linux,OTOH,提供了一种简洁的 sysconf() 检索相似信息的方法。详情请参阅 this page

即使您的 OS 是 64 位的,也不一定意味着您的 应用程序 可以访问超过一定的限制。例如 Windows 7 64 位将只允许您在应用程序代码中寻址最多 8GB 的​​内存,即使完整的虚拟内存 space 是 16TB。

循环执行的迭代太多,你设计的是程序崩溃或循环死无限的主要原因。

您希望知道的答案非常复杂,因为有一些要点---->>

1. 这取决于程序运行的平台,例如 windows、linux 或 mac。 我认为内存量不受限制 除了物理内存之外的任何东西。

事实-> 虽然物理内存可以通过虚拟内存扩展,但并非所有平台都具有'virtual memory' 的特性。 C没有虚拟内存的概念。 Malloc 分配连续的内存(意味着并排或一起在 ram 中)。
因此,这取决于平台处理请求的方式。这取决于 C 实现。

2. 标准类型 'size_t' 可表示的最大数(以字节为单位)(由 声明)。这个值可以并且确实在不同的实现中有所不同。请注意,此值不一定与主机(即最终用户)平台的可用内存一样大。

QUES. 有什么限制吗?我应该去哪里 这种信息?

答案。 Malloc 的参数是一个 size_t 并且该类型的范围是 [0,SIZE_MAX],所以你可以 request 的最大值是 SIZE_MAX,这值 因实施而异 并在 .

注意:- SIZE_MAX 字节的请求是否成功取决于本组范围之外的因素。

您可以分配的最大内存量受多个因素控制,并且会随时间变化。

其中包括: 1. 硬件限制 2. OS 限制 三、系统参数 4.进程配额 5.页面文件space

此外,malloc 是一种非常糟糕的分配大块内存的方法。

你的程序崩溃了,因为 malloc 是 returning null 并且你在没有检查的情况下使用那个 return 值。