C 简单for循环初始化时的SEGFULT
我一定是疯了。我在(I=0;IC 简单for循环初始化时的SEGFULT,c,segmentation-fault,C,Segmentation Fault,我一定是疯了。我在(I=0;I
行中遇到了一个segfault。我从未遇到过类似的情况。下面是完整的代码:
#include <stdio.h>
#include <time.h>
#define N 2400
#define M 2000
#define P 500
int main() {
int a[N][N];
int b[N][N];
int c[N][N];
int i, j;
// Initialize matrix A
for(i = 0; i < N; i++) {
for(j = 0; j < M; j++) {
a[i][j] = j-1+2;
}
}
// Initialize matrix B
for(i = 0; i < M; i++) {
for(j = 0; j < P; j++) {
b[i][j] = i-j+1;
}
}
}
#包括
#包括
#定义N 2400
#定义M 2000
#定义P 500
int main(){
INTA[N][N];
INTB[N][N];
国际c[N][N];
int i,j;
//初始化矩阵A
对于(i=0;i
首先:您已将a、b和c声明为[N][N]矩阵,但您将它们初始化为[N][M]和[M][p]矩阵。考虑到N>M>p,这不应导致segfault,但目的不明确
其次,如果将定义替换为:
#define N 10
#define M 5
#define P 2
程序正常运行。这是因为局部变量a
和b
存储在堆栈上,并且堆栈的大小受到限制。请查阅编译器和系统文档以准确了解施加的限制
为避免此类问题,请使用malloc
或等效函数分配内存,该函数在堆上分配内存,限制较小。大多数编译器将局部变量(包括完整数组)放在堆栈上。堆栈空间有限,在Windows上默认堆栈空间仅为一兆字节。您的a
,b
和c
数组各有21MB……因此您应该使用malloc()
或calloc()
为这些数组分配内存。或者只是减少元素计数以适应堆栈。实际上,您是在inta[N][N]处获得它的
如果您在linux下,请在正在使用的shell上运行ulimit-s unlimited
,运行程序可执行文件以避免堆栈耗尽。@simpel01或者,如果您不打算递归调用main()
,请声明数组静态
。