C 为什么可以';我不能把这个数组放大吗?

C 为什么可以';我不能把这个数组放大吗?,c,arrays,2d,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++)

这段代码在数组大小为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;
}
无效矩阵(int-matrix1[2500][2500],int-matrix2[2500][2500],int-n) { int i,j,resultmatrix[2500][2500],k;
对于(i=0;i您尝试分配2500倍2500倍
sizeof(int)
字节的内存。这看起来确实像是内存问题。您从一开始就这样做了,它是否还没有初始化并不重要。

考虑到2D数组的大小,很可能是堆栈溢出

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


希望这有帮助

给定32位
int
局部变量
intxxx[2500][2500];
每个堆栈上都需要25兆字节,其中有3个,因此75兆字节会破坏堆栈

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

int resultmatrix[2500][2500];
int matrix1[2500][2500];
int matrix2[2500][2500];
下一步可能是使用
malloc()
动态分配内存

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

int *matrix1 = malloc(2500*2500*sizeof(int));
...
    matrix1[j*2500+i] = rand();
其次,通过为行指针数组分配内存来生成一个二维数组,并为每一行分配内存

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();
int**matrix1=malloc(2500*sizeof(int*);//注意大小是指针大小

对于(int i=0;我将两个矩阵从main中去掉,或者使用malloc。首先-永远不要使用数组作为参数。为什么?因为它们是无用的、令人困惑的,并且总是转换为指针。这意味着在您的情况下-您不会限制“matrix\u multi”中的“matrix1”具有特定大小,甚至是一个数组。在t(&matrix1)[2500][2500]”。起初我确实希望动态创建数组,但ı得到错误“下标值既不是数组,也不是指针或向量”然后像这样改变它使用全局变量是有效的,但是想知道全局变量和局部变量在空间中的区别是什么memory@Lutfiyekaya局部变量放在堆栈上,通过
malloc()
获得的内存来自堆,全局变量没有一个简单的答案-试试这个问题。