我试图在c中声明一个500 x 500的2d数组。每次这样做,它都会抛出编译时错误,说明"数组大小太长"。我怎样才能解决这个问题??使用的编译器是windows 8.1上的turbo c++
#include<stdio.h>
int a[500][500];
void main()
{
printf("nEnter the size of array:n");
scanf("%d%d", &m,&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
a[i][j]=0;
}
有多种处理多维数组的方法。最简单的方法是将其声明为数组的数组:
int array[X][Y];
然而,就像我在评论中说的,如果声明为本地变量,可能会导致堆栈溢出。如果它是一个全局变量,则没有问题(除非总大小太大,无法容纳系统的(虚拟)内存)。
另一种方法可能是将其声明为指向所需类型的指针数组,然后在循环中分配"第二"维:
int *array[X];
for (size_t i = 0; i < X; ++i)
array[i] = malloc(sizeof(int) * Y);
第三种选择,如果我的例子中的X
仍然太大,是使用指向类型的指针的指针:
int **array;
array = malloc(sizeof(int*) * X);
for (size_t i = 0; i < X; ++i)
array[i] = malloc(sizeof(int) * Y);
注意:当动态分配内存时,例如malloc
,您需要在完成后将内存free
。
当您将int
的500x500矩阵声明为局部变量时,如:
void somefunction() {
int myarray[500][500];
// ...
}
请求1MB的堆栈(假设sizeof (int) == 4
,这在x86上很常见)。在大多数编译器上,堆栈大小默认限制为1MiB,原因很好:检测可能的无限递归。实际上,栈达到它的1MiB限制是非常不寻常的,所以我建议不要更改默认值。
你有两种可能:
- 使用
int* myarray = malloc(500 * 500 * sizeof (int));
在堆上分配它。当你完成时,记得调用free(myarray);
! - 将数组声明为全局变量(除非有充分的理由,否则不要这样做)。
如果数组很大,应该在堆上分配它,例如使用malloc()
函数。由于堆栈帧的大小有限,编译器抛出该错误。
我会这样做:
- 为指向int 的指针数组[500]分配内存
- 然后,对于该数组中的每个指针,为int型数组[500]分配内存,并将当前指针分配给已分配的int型数组;
这里有一个小程序,用0到249999的数字填充数组[500][500]。注意输出:)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* array[500];
int rows, cols, num = 0;
for (rows = 0; rows < 500; rows++) {
array[rows] = malloc(500* sizeof(int));
for (cols = 0; cols < 500; cols++) {
array[rows][cols] = num;
num++;
}
}
for (rows = 0; rows < 500; rows++) {
for (cols = 0; cols < 500; cols++) {
printf("%dn",array[rows][cols]);
}
free(array[rows]);
}
return 0;
}