[英]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.