为什么我不能让这个数组更大?

时间:2015-02-28 16:48:58

标签: c arrays 2d

此代码与数组大小200完美配合。任何大于此值并且它会产生运行时错误。但为什么它会给出运行时错误?是因为我没有足够的记忆或其他东西吗?

这是代码:

void matrix_multip(int matrix1[2500][2500],int matrix2[2500][2500],int n)
{
    int i,j,resultmatrix[2500][2500],k;

    for(i=0;i<n;i++)
    {
       for(j=0;j<n;j++)
       {
           resultmatrix[i][j]=0;

           for(k=0;k<n;k++)
           {
               resultmatrix[i][j]=resultmatrix[i][j]+matrix1[i][k]*matrix2[k][j];
           }
        }
    }
}

int main()
{
  int matrix1[2500][2500],matrix2[2500][2500],n=100,i,j,k;

  for(k=0;k<12;k++)
  {
      for(i=0;i<n;i++)
      {
          for(j=0;j<n;j++)
          {
              matrix1[i][j]=rand();
              matrix2[i][j]=rand();
          }
      }

      clock_t start=clock();

      matrix_multip(matrix1,matrix2,n);

      clock_t end=clock();

      double seconds=(double)(end-start)/CLOCKS_PER_SEC;

      printf("matrix multiplacition for %dx%d took %lf seconds \n ",n,n,seconds);
      n=n+200;
  }

  return 0;
}

3 个答案:

答案 0 :(得分:1)

给定一个32位int,局部变量int xxx [2500][2500];每个将需要25 MB的堆栈,其中有3个,所以75 MB突破堆栈。

第一步是将数组声明为静态全局变量,将它们移出函数,例如

int resultmatrix[2500][2500];
int matrix1[2500][2500];
int matrix2[2500][2500];

下一步可能是使用malloc()动态分配内存。有两种方法可以做到这一点。

首先作为一维数组,通过计算数组偏移量将其索引为2-D。

int *matrix1 = malloc(2500*2500*sizeof(int));
...
    matrix1[j*2500+i] = rand();

其次,通过为行指针数组分配内存来制作2-D数组,并为每个行分配内存。但我们在这个问题之外偏离了......

int **matrix1 = malloc(2500*sizeof(int*));      // note size is pointer size
for (int i=0; i<2500; i++)
    matrix1[i] = malloc(2500*sizeof(int));      // note size is integer size
...
    matrix1[j][i] = rand();

我将你留给free()分配的内存。

答案 1 :(得分:0)

您尝试分配2500次2500 sizeof(int)字节的内存。这看起来像是一个记忆问题。你在一开始就做对了,它没有被初始化也没关系。

答案 2 :(得分:0)

考虑到2D阵列的大小,您很可能会溢出堆栈。

如果将这些2D数组定义为全局变量(当前在main中定义),则很可能(这取决于您的系统)您将不会得到(相同的)运行时错误。

希望这有帮助