【问题标题】:Segmentation Fault on Small(ish) 2d array小(ish)二维阵列上的分段错误
【发布时间】:2011-08-05 23:46:04
【问题描述】:

我不断使用以下代码进行分段。将 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;
}

【问题讨论】:

  • @berry:不能用 malloc 初始化数组类型,只能用指针类型。
  • @Dietrich Epp 对不起,你当然很成功。显示我的 C 有多生锈(以及为什么我不应该在疲倦时发布临时 cmets!)

标签: c arrays segmentation-fault


【解决方案1】:

问题是你溢出了堆栈。

当您调用 initialize_mx() 时,它会为其局部变量(在您的情况下为 confmx)分配堆栈空间。这个空间受你的操作系统限制(如果你在 linux 上检查 ulimit),如果局部变量太大,可能会溢出。

基本上你可以:

  1. 按照 cnicutar 的建议将 confmx 声明为全局变量。
  2. Allocate memory space for your array dynamically. 并将指针传递给initialize_mx()

编辑:刚刚意识到如果你传递一个指针,你仍然必须分配内存空间,所以你有这两个选项:)

【讨论】:

  • 考虑到这个站点叫做 StackOverflow,一个非常适合的问题。
  • 这是我在 SO 的第一个问题,我使用链接到的教程作为理解我的问题的指南;)
【解决方案2】:

您在堆栈上使用了 4000*4000*4 字节,如果我没有犯任何计算错误,那就是 61MB,这是很多。它适用于 1000,因为在这种情况下,您的堆栈仅使用了近 4MB。

【讨论】:

    【解决方案3】:

    4000*4000*sizeof(float)==64000000。我怀疑您的操作系统可能将堆栈大小限制在 4 到 64 MB 之间。

    【讨论】:

      【解决方案4】:

      正如其他人所指出的,对于分配在堆栈上的 auto 类变量,smallish 并不小。

      根据你的需要,你可以

      static float confmx[MAXLEN][MAXLEN];
      

      这将在 BSS 中分配存储。您可能需要考虑另一种存储系统,因为它通常只需要一个稀疏矩阵,并且有更有效的方法来存储和访问许多单元格为零的矩阵。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-07
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多