【问题标题】:matrix generator - segmentation fault in C矩阵生成器 - C 中的分段错误
【发布时间】:2013-04-03 14:03:16
【问题描述】:

我有以下生成对称矩阵的函数:

void genMatrix(int n, double A[n][n])
 {

int i,j;
int count=0;
for (i=0; i<n; i++)
for (j=i+1; j<n; j++)
    {
    count++;
    A[i][j]=count;
    A[j][i]=count;
    }

 }

当我使用这些参数调用函数时:

int n = 10000;
double A[n][n];
genMatrix(n,A);

它给了我一个分段错误,我不明白为什么。我也尝试只用 1 个值填充矩阵,但它不会改变任何东西。 可能是什么问题呢?使用较小的 n 值(例如 1000)可以正常工作。

【问题讨论】:

  • 这使用 VLA,可变长度数组,在 C++ 中不存在。于是我取出了C++标签。
  • 请告诉我们:1) 您正在使用的系统,2) 您正在使用的语言 3) 您正在使用的编译器。除了我无法编译之外,我没有看到任何错误,因为在以下行中,我的 Microsoft 编译器为 A[n][n]n 中的 n 提取了一个常量表达式:“void genMatrix(int n, double A[n].[n ])”。看起来不是 C 语言。
  • @MichaelWalz,这是带有 VLA 的 C,所以至少是 C99。微软编译器从来没有做到这一点。
  • @Jens Gusted:感谢您提供的信息。我也没有做到这一点:-)
  • gcc 编译器,ubuntu 系统

标签: c matrix segmentation-fault


【解决方案1】:

您可能只是在这里遇到了堆栈溢出。数组太大,无法放入程序的堆栈地址空间。

如果你在堆上分配数组,你应该没问题,假设你的机器有足够的内存。

【讨论】:

  • 在堆上分配数组是什么意思?
  • @biggdman,请阅读 C 中的动态分配,mallocfree 是您正在寻找的函数
  • @biggdman,您的问题表明您需要先继续阅读。 SO 不是讨论的网站。
【解决方案2】:

您尝试在堆栈上创建一个 400 兆字节的数组?那几乎行不通。大多数现代操作系统都有 1 到 4 兆字节的堆栈。

【讨论】:

    【解决方案3】:

    这会在函数的“堆栈”上分配一个非常大的矩阵。这不是一个好主意,你有一个“stackoverflow”。

    【讨论】:

    • 如果我将函数的代码复制到 main 中,可以吗?
    【解决方案4】:

    您正在尝试创建一个大小为 800MB 的自动变量(假设 double 是 64 位)。在大多数平台上,自动变量是在堆栈上创建的,该堆栈的总大小通常只有几兆字节。分配太大的东西会导致堆栈溢出和(如果幸运的话)分段错误。最好动态分配大对象。

    【讨论】:

    • @biggdman:在 C 中,使用 malloc。该问题最初也被标记为 C++(尽管代码不是有效的 C++);在那种语言中,更喜欢 std::vector 这样的容器。
    • @cf16:SI 单位“mega”,用“M”表示,意思是 10^6,这就是我的意思。有些人可能会滥用它来表示 2^20(甚至 10^3 * 2^10),但这不是我的意思。
    【解决方案5】:

    好吧,您的数组似乎太大而无法放入程序的堆栈地址空间。因为它的大小是

    381.47 MB​​

    它太大了,例如 windows 只给你

    1MB

    默认堆栈

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多