1

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

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,它可以正常工作。

4

5 回答 5

5

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

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

于 2013-04-03T14:05:22.693 回答
1

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

于 2013-04-03T14:07:13.820 回答
0

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

于 2013-04-03T14:05:24.927 回答
0

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

381.47 MB

它太大了,例如 windows 只给你

1MB

默认堆栈

于 2013-04-03T14:07:05.240 回答
0

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

于 2013-04-03T14:08:18.360 回答