繁体   English   中英

如何在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()失败,在这种情况下,它返回一个NULL指针而不分配任何内存 它总是一个全有或全无的分配。 它要么成功并分配所请求大小的完整内存块,要么失败,返回NULL指针而不分配单个字节。

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

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

Linux,OTOH,提供了一种简洁的sysconf()方法来检索类似的信息。 有关更多详细信息,请参阅此页面

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

你的代码是错误的,原因如下

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

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

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

    因此,它要么完全成功(分配了所请求内存的确切数量),要么完全失败(返回空指针),没有像可用内存部分成功或者您可能假设的那样的权衡

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

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

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

那说,

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

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

“但程序崩溃了”

这很可能是未定义行为的结果。 在您的代码中,您直接取消引用返回的指针,而没有成功检查malloc() 很可能malloc()失败并返回NULL ,取消引用会导致UB。

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

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

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

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

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

由于一些关键的注释---- >>,回答你期望知道的事情是非常复杂

1.这取决于程序正在运行的平台,如windows,linux或mac。 我认为内存量不受任何限制,而是物理内存。

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

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

QUES。 对此有任何限制吗? 我应该在哪里获得这种信息?

答案 Malloc的参数是size_t,该类型的范围是[0,SIZE_MAX],因此您可以请求的最大值是SIZE_MAX,该值因实现而异,并在中定义。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM