是否有可能在c中分配大数组?

时间:2014-03-19 16:55:06

标签: 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是常量 我需要构建这个大小的图形 有可能吗?

如果我将它拆分它会有帮助吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

1)malloc参数的大小。它的类型为size_t,它是一个无符号整数类型,至少为16位且大到足以容纳任何对象的大小或任何数组的索引。在实践中,它往往是平台的本机字大小,即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)很可能是2,而sizeof(short *)(指针大小)是4或8。 malloc的簿记还有一些额外的开销,但仍然是“超过8 GB”。

一些风格观察:

  • 如果您需要特定的16位,例如stdint.huint16_t
  • ,使用uint_least16_t中的某种类型会更好。
  • 您不应该在C中转换malloc的返回值(与C ++不同)
  • 您可以将sizeof(unsigned short int *)替换为sizeof(*graph),将sizeof(unsigned short int)替换为sizeof(**graph)以避免重复(并允许您更改graph的类型而不更改{ {1}}来电)
  • 您不需要malloc
  • 中的int

答案 1 :(得分:0)

允许的最大大小为整数范围。因此,如果您使用的是16位操作系统,则最大大小为65535,如果使用的是32位操作系统,则大小为4,294,967,295。

答案 2 :(得分:0)

非排列数据的最大大小为SIZE_MAXSIZE_MAX 至少 65535。

SIZE_MAXsize_t类型,通常与unsigned的类型相同,但可能不同。

使用malloc()提供的单个最大分配是SIZE_MAX

void *malloc(size_t size);
由于整数数学溢出,

sizeof(unsigned short int *) * 65535可能会失败。

要分配大于SIZE_MAX的数组(但每个元素仍为&lt; = SIZE_MAX),请使用calloc()

void *calloc(size_t nmemb, size_t size);
unsigned short int **graph = calloc(65535u, sizeof *graph);
相关问题