【问题标题】:Allocating A Large (5000+) Array分配大型 (5000+) 数组
【发布时间】:2025-12-22 06:45:06
【问题描述】:

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

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

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

执行以下操作时出现运行时错误:

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

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

1000 和 5000 的大小似乎可以正常工作,但我怎样才能以这种方式制作大小为 500k 的数组?

【问题讨论】:

  • “无法分配”到底是什么意思?你有错误吗?消息是什么,你从哪里得到的?请注意,500000 个元素不是 500K。它可能是 2Meg,因为 C ints 通常是每个 4 字节。
  • 我的意思是我遇到了运行时错误,500k 我的意思是 500,000 个元素不是大小
  • 运行时错误是堆栈溢出

标签: c arrays memory-management


【解决方案1】:

您的堆栈无法容纳那么多数据。您必须按如下方式在堆上分配大数组:

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

正如 pmg 指出的,记住在完成后释放你的记忆。

free(array);

【讨论】:

  • 问题中的语言是c
  • 或者,它的 C 等价物 int * array = malloc(sizeof(int) * size)
  • 请不要强制转换 malloc 返回的值
  • 不要转换malloc的返回值。它没有任何用处,可能会隐藏错误。
  • 我喜欢将对象本身用于sizeof 运算符。如果以后数据类型发生变化,只需要修改1段代码:int *array; array = malloc(nelems * sizeof *array); ... double *array; array = malloc(nelems * sizeof *array); /* same malloc as before */
【解决方案2】:

对于堆栈来说太大了。相反,您需要使用 malloc 在堆上分配它。

【讨论】:

    【解决方案3】:

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

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

    不要忘记检查分配是否成功(如果没有 - malloc 返回 NULL)。

    正如 pmg 提到的 - 由于这个数组不在堆栈中,一旦你完成了它,你必须free它。

    【讨论】:

    • 完成操作后请记住free 指针。