大家好,我想使用以下内容:
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)
很可能为 2
,sizeof(short *)
(指针大小)为 4 或 8。malloc
也有一些额外的开销的簿记,但仍然四舍五入为“超过 8 GB”。
一些风格观察:
- 如果您特别想要 16 位,则使用
stdint.h
中的一种类型会更好,例如uint16_t
或uint_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/