C 小(ish)2d阵列上的分段故障
我一直用下面的代码进行分段。将4000更改为1000可以使代码正常运行。我想我在这里有足够的记忆。。。我怎样才能解决这个问题C 小(ish)2d阵列上的分段故障,c,arrays,segmentation-fault,C,Arrays,Segmentation Fault,我一直用下面的代码进行分段。将4000更改为1000可以使代码正常运行。我想我在这里有足够的记忆。。。我怎样才能解决这个问题 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #define MAXLEN 4000 void initialize_mx(float mx[][MAXLEN]) { int i, j; float c=0;
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 4000
void initialize_mx(float mx[][MAXLEN])
{
int i, j;
float c=0;
for(i=0;i<MAXLEN;i++){
for(j=0;j<MAXLEN;j++) mx[i][j]=c;
}
}
int main(int ac, char *av[])
{
int i, j;
float confmx[MAXLEN][MAXLEN];
initialize_mx(confmx);
return 0;
}
#包括
#包括
#包括
#包括
#定义MAXLEN 4000
无效初始化\u mx(浮动mx[][MAXLEN])
{
int i,j;
浮点数c=0;
对于(i=0;i你在堆栈上使用4000*4000*4字节,如果我没有任何计算错误,那是61MB,这是很多。它可以使用1000,因为在这种情况下,你在堆栈上只使用了近4MB。你在堆栈上使用4000*4000*4字节,如果我没有任何计算错误,那是61MB,这是很多。它可以使用1000,因为在这种情况下,您的堆栈上只使用了近4MB。4000*4000*sizeof(float)==64000000
。我怀疑您的操作系统对堆栈大小的限制可能在4到64MB之间。4000*4000*sizeof(float)==64000000
。我怀疑您的操作系统对堆栈大小的限制在4到64 MB之间。问题是堆栈溢出
当你调用initialize\u mx()
时,它会为它的局部变量分配堆栈空间(在你的例子中是confmx)。这个空间受你的操作系统限制(如果你在linux上,请检查ulimit),如果局部变量太大,可能会溢出
基本上你可以:
按照cnicutar的建议,将confmx声明为全局变量
并将指针传递到initialize\u mx()
编辑:刚刚意识到如果你传递一个指针,你仍然必须分配内存空间,所以你有两个选择:)问题是你的堆栈溢出了
当你调用initialize\u mx()
时,它会为它的局部变量分配堆栈空间(在你的例子中是confmx)。这个空间受你的操作系统限制(如果你在linux上,请检查ulimit),如果局部变量太大,可能会溢出
基本上你可以:
按照cnicutar的建议,将confmx声明为全局变量
并将指针传递到initialize\u mx()
编辑:刚刚意识到,如果你传递一个指针,你仍然必须分配内存空间,所以你有两个选项:)正如其他人所指出的,smallish对于堆栈上分配的auto
类变量来说并不小
根据你的需要,你可以
static float confmx[MAXLEN][MAXLEN];
将在BSS中分配存储。您可能需要考虑不同的存储系统,因为一个通常只需要一个稀疏矩阵,并且有更有效的方式来存储和访问许多单元为零的矩阵。他一叠
根据你的需要,你可以
static float confmx[MAXLEN][MAXLEN];
它将在BSS中分配存储。您可能需要考虑不同的存储系统,因为一个通常只需要稀疏矩阵,并且有更有效的方式来存储和访问许多单元为零的矩阵。
@ BRY:不能用MALOC初始化数组类型,只有指针类型。@迪特里希EPP抱歉,您是Bang.当然开了。显示了我的C有多生锈(为什么我累了不应该发表特别的评论!)@berry:你不能用malloc初始化数组类型,只能用指针类型。@Dietrich Epp抱歉,你当然开了。显示了我的C有多生锈(为什么我累了不应该发表特别的评论!)考虑到这个网站被称为StackOverflow,一个非常合适的问题。这是我在SO的第一个问题,我用我链接到的教程作为指导来理解我的问题;)考虑到这个网站被称为StackOverflow,一个非常适合的问题。这是我在SO的第一个问题,我使用了我链接到的教程了解我的问题的指南;)