程序中声明了一个大数组,运行时报错:Segmentation fault ,如何解决?

hpcczq 2003-09-22 04:33:47
#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
报错是由于数组太大的缘故,不知如何解决,请教大虾!
...全文
3192 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyr311 2003-09-23
  • 打赏
  • 举报
回复
有的,我见过三维数组的这种分配,具体的程序片段我回去给你找一找,下午给你答案
lyr311 2003-09-23
  • 打赏
  • 举报
回复
给个一般一点的,给三维数组lay[10][20][30]分配空间及释放(VC6.0,DevC++下调试通过):

#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);
}
lyr311 2003-09-23
  • 打赏
  • 举报
回复
/* 给三维数组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);
jakeye 2003-09-22
  • 打赏
  • 举报
回复
malloc()这个函数也是用来分配内存的。
释放用free()函数
yuefeng521521521 2003-09-22
  • 打赏
  • 举报
回复
c下不是有malloc和free么?
hpcczq 2003-09-22
  • 打赏
  • 举报
回复
多谢各位的答复,感谢lyr311(老刘)给的例程。

不过我是在标准C下写程序,没法用new、delete呀!
除了将float D[N][N]放到main外面成为全局变量外,是否还有别的办法啊?
lyr311 2003-09-22
  • 打赏
  • 举报
回复
我给你查了一下资料,二维数组的堆内存分配格式是这样的(比一纬数组复杂得多啊):
#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;
}
strikebone 2003-09-22
  • 打赏
  • 举报
回复
建议你看一下堆分配的问题,
lyr311 2003-09-22
  • 打赏
  • 举报
回复
对,数组元素太多会出现栈空间的溢出,编译的时候当然没问题了,栈空间的分配是在运行的时候分配的。解决问题的最好办法是进行堆内存分配,堆内存就很大,我记得有人曾经说过栈空间的大小只有K数量级,而堆空间的大小可以达到G的数量级(当然是有虚拟内存了),足够你用了。堆空间分配就是用new啊,用了之后要注意delete来释放哦
louguoqiang 2003-09-22
  • 打赏
  • 举报
回复
你把float D[N][N]定义为函数内部的局部变量,它占用的是栈空间,而栈空间是有默认大小的限制的,数组太大会造成这个问题,建议你把float D[N][N]放到main外面成为全局变量,或者用new来分配。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧