分段错误(核心转储),而 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
以下代码导致分段错误(核心转储),循环次数为 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
:
ulimit -s # stack size
ulimit -a # full details