分段错误(核心转储),而 C 代码中有大量 for 循环

segmentation fault (core dumped) while huge number of for loops in c code

以下代码导致分段错误(核心转储),循环次数为 1000000000 次。 但是通过将循环时间减少到 100000,就可以了。

它是否会导致 cpu、硬件或任何地方出现问题?是看门狗定时器引起的吗?

谁能帮忙解释一下?当 cpu 进入大循环(具有大量重复的有限循环)时发生了什么? cpu 如何判断计算是无限的?非常感谢。

#include <stdio.h>

int main () {
    int a[1000000000];
    int i = 0;

    for (i = 0;i < 1000000000; i++){
        if(i % 4 == 0){
            a[i] = i;
        }else {
            a[i] = 321;
        }
    }

    printf("run over");

    return 0;
}

此处观察到堆栈溢出。 1000000000 * sizeof(int) 内存应该用于存储这个数组。简而言之,问题出在数组的大小而不是迭代次数。

您可以将数组设为静态或动态分配内存。

您是不是 运行 记不清了?如果使用 32 位整数,您的 10 亿整数数组重 30 Gb。

发生这种情况是因为堆栈有内存限制。您的数组将占用总共 1000000000 * sizeof(int) 个字节,在 64 位机器上等于 3.725 Gigabytes

您需要像这样在堆内存中动态存储数组:

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

或者,最好将数组分成几个部分并对其进行处理,处理后将这些结果存储在硬盘上。

此外,您可以使用 ulimit:

查看 linux 上的最大堆栈大小
ulimit -s # stack size
ulimit -a # full details