#include <stdio.h>
#define N 2000
int main(void)
{
int i,j;
float D[N][N];
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
D[i][j] = 0;
}
}
return 0;
}
gcc -o test test.c 编译没问题,运行时出错:Segmentation fault
报错是由于数组太大的缘故,不知如何解决,请教大虾!
你把float D[N][N]定义为函数内部的局部变量,它占用的是栈空间,而栈空间是有默认大小的限制的,数组太大会造成这个问题,建议你把float D[N][N]放到main外面成为全局变量,或者用new来分配。
对,数组元素太多会出现栈空间的溢出,编译的时候当然没问题了,栈空间的分配是在运行的时候分配的。解决问题的最好办法是进行堆内存分配,堆内存就很大,我记得有人曾经说过栈空间的大小只有K数量级,而堆空间的大小可以达到G的数量级,足够你用了。堆空间分配就是用new啊,用了之后要注意delete来释放哦
建议你看一下堆分配的问题,
我给你查了一下资料,二维数组的堆内存分配格式是这样的:
#include <iostream.h>
void main()
{
int n,**p;
cin>>n;
p=new int*[n];
for(int i=0;i<n;i++)
p[i]=new int[n];
for(i=0;i<n;i++)
delete [] p[i];
delete [] p;
}
malloc()这个函数也是用来分配内存的。
释放用free函数
有的,我见过三维数组的这种分配,具体的程序片段我回去给你找一找,下午给你答案
/* 给三维数组lay[10][10][10]分配空间 */
/*******************3D array allocate**********************/
lay=(float***)malloc(10*sizeof(float**));
for(i=0;i<10;i++)
{
lay[i]=(float**)malloc(10*sizeof(float*));
for(j=0;j<10;j++)
lay[i][j]=(float*)malloc(10*sizeof(float));
}
释放空间
/********************free 3d array***********************/
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
free(lay[i][j]);
}
free(lay[i]);
}
free(lay);
给个一般一点的,给三维数组lay[10][20][30]分配空间及释放:
#include <malloc.h>
void main()
{
float ***lay;
int i,j;
/*******************3D array allocate**********************/
lay=(float***)malloc(10*sizeof(float**));
for(i=0;i<10;i++)
{
lay[i]=(float**)malloc(20*sizeof(float*));
for(j=0;j<20;j++)
{
lay[i][j]=(float*)malloc(30*sizeof(float));
}
}
/********************************************************/
/********************************************************/
/********************************************************/
/********************free 3d array***********************/
for(i=0;i<10;i++)
{
for(j=0;j<20;j++)
{
free(lay[i][j]);
}
free(lay[i]);
}
free(lay);
}