为什么我不能让这个数组更大?
Why can't I make this array bigger?
此代码在数组大小为 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;
}
您尝试分配 2500 次 2500 次 sizeof(int)
字节的内存。这看起来确实像内存问题。你一开始就做对了,没初始化也没关系。
鉴于二维数组的大小,您很可能溢出了堆栈。
如果您将这些二维数组定义为全局变量(当前在 main 中定义),则很有可能(这取决于您的系统)您不会遇到(相同的)运行时错误。
希望对您有所帮助
给定一个 32 位 int
局部变量 int xxx [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();
我留给你 free()
分配的内存。
此代码在数组大小为 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;
}
您尝试分配 2500 次 2500 次 sizeof(int)
字节的内存。这看起来确实像内存问题。你一开始就做对了,没初始化也没关系。
鉴于二维数组的大小,您很可能溢出了堆栈。
如果您将这些二维数组定义为全局变量(当前在 main 中定义),则很有可能(这取决于您的系统)您不会遇到(相同的)运行时错误。
希望对您有所帮助
给定一个 32 位 int
局部变量 int xxx [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();
我留给你 free()
分配的内存。