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

时间:2017-02-15 09:35:16

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

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

#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大小。但程序崩溃了。 在这个例子中真正分配了多少内存?

4 个答案:

答案 0 :(得分:8)

允许

malloc()失败,在这种情况下,它返回一个NULL指针而不分配任何内存。它始终是 all-or-nothing 分配。它要么成功并分配一大块请求大小的内存,要么失败,返回NULL指针而不分配单个字节。

至于知道有多少可用内存 - 这实际上取决于环境:你运行的是什么操作系统,是一个16位,32位,64位内存架构?

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

Linux,OTOH,提供了一种简洁的sysconf()方式来检索类似的信息。有关详细信息,请参阅this page

即使您的操作系统是64位,也不一定意味着您的应用程序可以访问超过某个限制。例如,即使完整的虚拟内存空间为16TB,Windows 7 64位也只允许您在应用程序代码中寻址高达8GB的内存。

答案 1 :(得分:4)

由于

这么多原因,你的代码是错误的
  • 假设最大尺寸(对于平台/环境)最不可能是真实的,而不是可移植的。
  • 假设 malloc()提供 部分分配(最多可用内存) ,错了。

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

      

    malloc函数返回空指针或指向已分配空间的指针。

    所以, 要么完全成功(分配了所请求内存的确切数量)或完全失败(返回空指针),就没有权衡就像部分可用内存的成功或您可能假设的任何内容。

  • 您没有检查malloc()是否成功,导致可能的空指针取消引用。

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

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

那就是说,

  

1。 “我已在此示例中分配了最大int大小”

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

  

2。 “但程序崩溃了”

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

答案 2 :(得分:0)

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

这些包括: 1.硬件限制 2.操作系统限制 3.系统参数 4.处理配额 5.页面文件空间

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

您的程序崩溃,因为malloc返回null并且您正在使用该返回值而不进行检查。

答案 3 :(得分:-1)

循环执行的迭代次数很多,你设计的是程序崩溃或循环死无穷大的主要原因。

由于一些关键注释----&gt;&gt;

,回答您希望知道的非常复杂

1。这取决于程序正在运行的平台 windows,linux或mac。 我认为内存量不受限制 什么,但物理记忆。

事实 - &gt; 虽然物理内存可能会被虚拟内存扩展,但并非所有平台都具有“虚拟内存”的功能。  C没有虚拟内存的概念。 Malloc分配连续的内存(意味着并排或在ram中一起使用)                                                因此,它取决于平台处理请求的方式。这取决于C的实现。

2。标准类型可以表示的最大数字(以字节为单位)&#39; size_t&#39; (声明)。该值可以并且确实在实现之间变化。请注意,此值不一定与主机(,即最终用户)平台的可用内存一样大。

问题。对此有任何限制吗?我应该去哪儿 这种信息?

<强>答即可。 Malloc的参数是size_t,该类型的范围是[0,SIZE_MAX],因此 request 的最大值是SIZE_MAX,其值因实现而异并定义于。

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