分配一个大型(5000+)数组

7

我正在开发一个应用程序,其中输入的数据有三种可能的大小:

  • 小型:1000个元素
  • 中型:5000个元素
  • 大型:500,000个元素

问题是我无法分配大数组。似乎不接受超过5000的大小。

当我执行以下操作时,会出现运行时错误:

long  size=1000;
char ch;
int arr[size];
ch=getch();

if(ch==..)
  size=...;

1000和5000的大小似乎可以正常工作,但我如何以这种方式创建一个大小为500k的数组?


“cant allocate” 究竟是什么意思?你是否遇到了错误?错误信息是什么,它出现在哪里?请注意,500000个元素不是500K。由于C语言中的int类型通常每个占用4个字节,因此它可能是2兆。 - T.E.D.
我的意思是我得到了一个运行时错误,500k指的是500,000个元素而不是大小。 - Nathalie B
2
运行时错误是堆栈溢出。 - David Heffernan
3个回答

10

你可以在堆上分配这么大的数组:

int *arr;
arr = malloc (sizeof(int) * 500000);

别忘了检查分配是否成功(如果不成功 - malloc 返回 NULL)。

正如 pmg 提到的那样 - 由于该数组不位于栈中,所以您必须在完成操作后使用 free 进行释放。


并且请记得在完成操作后使用“free”释放指针。 - pmg

9

您的堆栈无法容纳那么多数据。您需要在堆上分配大型数组,如下所示:

int *array = malloc (sizeof(int)*size);

正如pmg所指出的那样,在完成后记得释放内存。

free(array);

问题中的语言为C - David Heffernan
1
或者,它的C语言等效写法是 int * array = malloc(sizeof(int) * size) - cobbal
3
请勿使用malloc返回值进行类型转换。 - David Heffernan
@pmg已经解释过了。这个网站上有无数篇更详细的帖子。 - David Heffernan
3
我喜欢在 sizeof 运算符中使用对象本身。如果数据类型将来发生变化,只需要更改一处代码:int *array; array = malloc(nelems * sizeof *array); ... double *array; array = malloc(nelems * sizeof *array); /* same malloc as before */ - pmg
显示剩余5条评论

4

这个对象太大了,栈空间不足以容纳。你需要使用malloc在堆上分配内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接