C语言求素数 数组长度过大后 程序异常停止

做了一道输出第n(1≤n≤10000)个素数的算法题,采用的是素数筛法。但不是很明白为什么下面代码中mark[]的长度在40001还可以正常运行,改到50000、100000或以上就崩溃了。代码如下:

#include <stdio.h>
#include <stdbool.h>
int prime[10001]; // 保存筛得的素数
int primeSize; // 保存素数的个数
bool mark[40001]; // 若mark[x]为true,则表示该数x已被标记成非素数

void init() {
    for (int i = 1; i <= 40000; i++) {
        mark[i] = false;
    }
    primeSize = 0;
    for (int i = 2; i <= 40000; i++) {
        if (mark[i]) continue;
        prime[primeSize++] = i;
        for (int j = i * i; j <= 40000; j += i) { // i*i之前的已经被标记
            mark[j] = true;
        }
    }
    printf("%d\n", primeSize);
}

int main() {
    init();
    int n;
    while (scanf("%d", &n) != EOF) {
        printf("%d\n", prime[n - 1]);
    }
    return 0;
}

如果是开的数组太大了,那这段程序也可以运行啊。希望有人解答一下,谢谢!

 #include <stdio.h>
int a[1000000];
int main() {
    a[999999] = 3;
    printf("%d\n", a[999999]);
    return 0;
}

void init() {
    for (int i = 1; i <= 40000; i++) {
        mark[i] = false;
    }
    primeSize = 0;
    for (int i = 2; i <= 40000; i++) {
        if (mark[i]) continue;
        prime[primeSize++] = i;
        for (int j = i * i; j <= 40000; j += i) { // i*i之前的已经被标记
            mark[j] = true;
        }
    }
    printf("%d\n", primeSize);
}

问题出在这里,并不在你说的内存溢出,请检查j的值,int j = i * i,当i>=46349,这里的j的值越界了,j变成了负数,同样进入循环,所以,你懂了。
####请采纳,回答不易~

大概是程序有数据段,一定范围内可以给你读取或写,一旦超出这个,数据不能给你读取,然后程序就崩溃了