大家好我想使用以下内容:
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是常量 我需要构建这个大小的图形 有可能吗?
如果我将它拆分它会有帮助吗?
谢谢!
答案 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”。
一些风格观察:
stdint.h
或uint16_t
uint_least16_t
中的某种类型会更好。
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_MAX
。 SIZE_MAX
至少 65535。
SIZE_MAX
是size_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);