Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 小(ish)2d阵列上的分段故障_C_Arrays_Segmentation Fault - Fatal编程技术网

C 小(ish)2d阵列上的分段故障

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;

我一直用下面的代码进行分段。将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;
  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的第一个问题,我使用了我链接到的教程了解我的问题的指南;)