如何在c语言中声明一个大小为500 x 500的二维数组



我试图在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限制是非常不寻常的,所以我建议不要更改默认值。

你有两种可能:

  1. 使用int* myarray = malloc(500 * 500 * sizeof (int));在堆上分配它。当你完成时,记得调用free(myarray); !
  2. 将数组声明为全局变量(除非有充分的理由,否则不要这样做)。

如果数组很大,应该在堆上分配它,例如使用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;
}

相关内容

  • 没有找到相关文章