当我输入值 200000 作为 long 变量的输入时,C 程序崩溃,为什么?

When I enter the value 200000 as an input for a long variable, C program crashes, why?

对于下面的简单代码,每当我输入值 200,000(或任何其他高值)时,程序就会崩溃:

    long size;
    printf("Enter the size of the array to be sorted: ");
    scanf("%ld",&size);

谁能告诉我为什么? 根据我的信息,long的范围远大于200,000

TIA

编辑: 上一段代码后跟这些声明。

int arrMerge[size];
int arrQuick[size];
int arrSelect[size];
int arrInsert[size];

当我对除那些行(以及上面的行)之外的整个程序进行评论时,它崩溃了。给出了以下终止消息:

进程返回 -1073741571 (0xC00000FD) 执行时间:2.419 秒 按任意键继续。

根据this Microsoft documentation, the status code 0xC00000FD stands for STATUS_STACK_OVERFLOW. Your program is failing due to a stack overflow

默认情况下,Windows 程序的最大堆栈大小约为 1 兆字节。如果你输入数字 200000,那么你的 variable-length 数组将超过这个限制,导致堆栈溢出。

您可能需要考虑在堆上而不是堆栈上为数组分配内存,例如使用函数 malloc。堆没有最多只能分配一个兆字节的限制。它能够存储更多的数据。

size设置为20万后,这些定义:

int arrMerge[size];
int arrQuick[size];
int arrSelect[size];
int arrInsert[size];

创建具有自动存储持续时间且每个大小为 800,000 字节的数组,假设 int 是四个字节,这在今天很常见。总共 3.2 MB。

自动存储持续时间通常使用堆栈实现(优化效果除外),默认堆栈大小在 macOS 上为 8 MiB,在 Linux 上为 2 MiB,在 Microsoft 上为 1 MiB Windows.1 因此,数组超出为堆栈设置的 space,程序崩溃。

脚注

1“MB”代表兆字节,1,000,000字节。 “MiB”代表兆字节,220字节=1,048,576字节。