gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:17:04 25 4
gpt4 key购买 nike

此代码在数组大小为 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;
}

最佳答案

给定一个 32 位 int 局部变量 int xxx [2500][2500]; 每个局部变量在堆栈上需要 25 MB,总共有 3 个,所以75 MB 破坏了堆栈。

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

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();

我让您free()分配的内存。

关于c - 为什么我不能让这个数组更大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28784257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com