C语言数组内存分配问题:读取1050个数字时程序崩溃
问题分析与解决
崩溃原因
你代码里的int array[length];是变长数组(VLA),它在程序的栈(stack)内存区域分配空间。栈的默认容量通常很小(比如Windows默认1MB,Linux默认8MB),当需要存储的元素数量过多时,栈空间会被耗尽,触发栈溢出,直接导致程序崩溃。1050个int元素本身仅占约4KB,但可能你的运行环境栈空间更小,或是栈上还有其他变量占用了空间,刚好达到这个数量时就触发了溢出。
解决方案
方案1:使用堆内存分配(推荐)
堆内存的容量远大于栈,适合存储大量数据。用malloc在堆上分配内存,使用完后用free释放,避免内存泄漏。修改后的代码如下:
#include <stdio.h> #include <stdlib.h> int main() { int length; scanf("%d", &length); printf("\nLength = %d\n", length); // 在堆上分配内存,长度为length个int的大小 int *array = malloc(length * sizeof(int)); // 必须检查内存分配是否成功 if (array == NULL) { printf("内存分配失败\n"); return 1; } for (int i = 0; i < length; i++) { scanf("%d", &array[i]); } printf("\nAll data are scanned\n"); for (int i = 0; i < length; i++) { printf("%d, ", array[i]); } // 释放堆内存,避免内存泄漏 free(array); return 0; }
方案2:调整栈大小(不推荐)
如果一定要使用栈上的变长数组,可以通过编译器参数调整栈的容量,但这种方式是平台相关的,会降低程序的可移植性。比如GCC编译器可以添加-Wl,--stack=10485760参数(指定栈大小为10MB),但仅适用于Windows环境;Linux下栈大小限制通常需要通过系统命令修改,操作更复杂。
内容的提问来源于stack exchange,提问作者Bobikwerty
相关产品推荐
相关产品推荐

