c - c中可以分配大数组吗?

标签 c

大家好,我想使用以下内容:

int i;
unsigned short int **graph;
graph = (unsigned short int**)malloc (sizeof(unsigned short int *) * 65535);
if (graph == NULL ) fprintf(stderr, "out of memory\n");
for (i = 0; i < 65535; i++){
    graph[i] = (unsigned short int*)malloc (sizeof(unsigned short int) *65535);
    if (graph[i] == NULL ) fprintf(stderr, "out of memory\n");
}

大小 65535 是常数 我需要构建这个大小的图表 这可能吗?

如果我把它分开会有帮助吗?

谢谢!

最佳答案

这里需要考虑四个不同的问题:

1) malloc 参数的大小。它的类型为 size_t,这是一种无符号整数类型,至少有 16 位,并且足够大以容纳任何对象的大小或任何数组的索引。实际上,它往往是平台的 native 字大小,即 32 位平台为 32 位,64 位平台为 64 位,因此您可能至少需要 32 位平台,但这几乎肯定是除非是为嵌入式(或非常复古)系统开发。

还应该记住,参数可能会溢出,并且您可能会默默地成功分配比您想象的更少的内存(例如,您可以有效地调用 malloc(65534) 当您认为自己正在调用 malloc(2 * 65535) 时。但在这种情况下,对于任何能够分配这么多内存的平台来说,这不太可能成为问题。

2) malloc 调用是否成功。您已经在检查这一点,因此只需运行代码即可回答该问题。您在这里分配了超过 8 GB† 的内存,因此除非编译为 64 位,否则它很可能会失败(因为 32 位的最大可寻址内存为 4 GB)。

3) 是否可以实际使用已分配的所有内存。某些操作系统会过度使用内存,并允许您分配比实际可用的内存多得多的内存。如果您实际上尝试使用已分配的所有内存,则可能会遇到麻烦。这取决于操作系统和实际可用的内存量,可能包括交换。

4) 对于运行程序的机器来说,内存中实际有那么多数据是否可行。即使 malloc 调用成功并且操作系统允许您使用分配的内存,它仍然超过 8 GB,这意味着典型的计算机可能应该安装至少 12 GB 的 RAM 来容纳此内存,操作系统和其他程序。否则,尽管理论上可行,但它可能会疯狂地交换。

您在评论中透露,您正在运行安装了 4 GB RAM 的 64 位机器,因此,如果您编译 64 位,前两点不是问题,但第 3 点可能是问题,第 4 点几乎是问题当然会。因此,要么安装更多 RAM,要么找出不同的方法来处理数据(例如,如果您根据变量名称存储图表,也许它通常足够稀疏,您不需要为最坏的情况进行分配) .

†“超过 8 GB”来自 65535 * sizeof(short *) + 65535 * 65535 * sizeof(short),其中 sizeof(short) 很可能为 2sizeof(short *)(指针大小)为 4 或 8。malloc 也有一些额外的开销的簿记,但仍然四舍五入为“超过 8 GB”。

一些风格观察:

  • 如果您特别想要 16 位,则使用 stdint.h 中的一种类型会更好,例如 uint16_tuint_least16_t >
  • 不应在 C 中强制转换 malloc 的返回值(与 C++ 不同)
  • 您可以将 sizeof(unsigned Short int *) 替换为 sizeof(*graph),将 sizeof(unsigned Short int) 替换为 sizeof(**graph) 以避免重复(并允许您更改 graph 的类型,而不更改 malloc 调用)
  • 您不需要 unsigned Short int 中的 int

关于c - c中可以分配大数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22512877/

相关文章:

c - 使用 NtCreateKey/NtOpenKey 获取 key 句柄

c - 转换和取消引用 void* 时出现段错误

c - Adobe alchemy 编译器问题 - 它生成 .l.bc 文件,如何将它们转换为 swc 文件?

c - 生成 RSA 并保存在 ASN.1/DER 中时出现段错误?

c - If else语句c程序中的多个条件

c - c 中的贪吃蛇游戏

c - _从 Visual Studio 2015 中的标准输入读取

c++ - C、C++ 与 Python 的接口(interface)

c - Windows 假脱机程序 API GetPrinter() 未返回正确填充的结构 PRINTER_INFO_6

c - 通过网络发送 Big Endian 格式的二进制文件