c - 如何分配 UINT_MAX 的 block 大小?

标签 c arrays malloc

<分区>

我想创建一个数组,其中的索引数量恰好为 UINT_MAX。由于某种原因,这非常困难。我尝试了以下方法:

  • char arr[UINT_MAX];//编译器声明数组大小不能为负数
  • char* const arr = calloc(UINT_MAX, sizeof(char));//运行但访问时出现段错误
  • char* const arr = malloc(sizeof(char) * UINT_MAX);//arr 为 NULL

我不明白这是怎么回事。是我的 HEAP 大小太低了吗?如果是这样,我该如何增加它? malloc/calloc 不能处理那种性质的 block 吗?我在 malloccalloc API 页面中没有发现任何有用的东西。

这个问题适用于 C 和 C++。

Windows 7 64 位、16GB RAM、CMake 3.6.1、GCC 7.11.1,并在 CLion 64 位上编译。

最佳答案

首先,我要指出的是,您可以并且应该使用errno 来检查 API 调用失败的原因。

现在,让我们检查一下您的尝试:

堆栈分配 - char arr[UINT_MAX]

您正试图在堆栈上分配 4294967295 字节,这是不可行的,因为操作系统将堆栈大小限制为更小的大小。您可以尝试使用此 manual 中指定的 API 来操作它.

分配

在大多数情况下,堆分配会因单一原因而失败:操作系统无法分配足够大的连续内存。

这并不是说您的系统没有 4GB 的可用内存,而是完全有可能没有适合您请求的单个连续内存块。所以,就像 mallocMSDN page指出:

malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available

调用

malloccalloc 使用相同的底层机制,因此如果一个失败,您应该预料到第二个也会失败。参见 remarks callocMSDN page 部分


关于 Linux 平台上的 malloc 的有趣事实

根据评论的要求,我将指出一些关于 malloc 在 Linux 上的实现的有趣事实,因为它有很大的不同!

首先,Linux明确规定它使用乐观的内存管理算法:

By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. In case it turns out that the system is out of memory, one or more processes will be killed by the OOM killer

这意味着内存实际上并不是被调用者拥有和专用的,而是操作系统希望在他需要的时候可以使用内存,如果不需要, 它恢复到一些令人讨厌的手段。

编辑:正如@Basile Starynkevitch 正确指出的那样,此机制取决于默认情况下启用的内存过度使用开关, 但是can be disabled .

关于c - 如何分配 UINT_MAX 的 block 大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46467142/

相关文章:

C API 设计 : what to do when malloc returns NULL?

c - 使用链表在C中进行插入排序

c - 第 98 次调用 pthread_create() 失败

javascript - 使用 _.differenceBy 从一个对象数组中删除另一个对象数组中的项目

C - 传递给函数的指针不保留指定的字符串

c - C 程序在查找整数三元组 (x,y,z) 时出错,使得 n^x + n^y = n^z 对于给定的 n 范围

c# - 嵌套数组循环迭代

java - 如何从 SoapObject 获取 byte[]

c - 释放后将变量设置为 NULL

c - 将 memcpy 与 void 指针一起使用时出现段错误 - C