我想确定我可以在计算机中分配的最大内存限制是多少。这是我为此任务编写的代码:
#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大小。但程序崩溃了。 在这个例子中真正分配了多少内存?
答案 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字节的请求是否成功取决于该组范围之外的因素。