如何在c语言中声明大小为500 x 500的2d数组?

如何在c语言中声明大小为500 x 500的2d数组?,c,multidimensional-array,size,C,Multidimensional Array,Size,我试图在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(

我试图在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;
}
#包括
INTA[500][500];
void main()
{
printf(“\n输入数组的大小:\n”);
scanf(“%d%d”,&m,&n);

对于(i=0;i如果数组很大,您应该在堆上分配它,例如使用
malloc()
函数。由于堆栈帧的大小有限,编译器会抛出该错误。

我会按以下方式做:

  • 为指向int的指针数组[500]分配内存
  • 然后,对于该数组中的每个指针,为[500]个整数数组分配内存,并将当前指针分配给分配的整数数组
这里有一个小程序,它用0到249999的数字填充数组[500][500]。请注意输出:)

#包括
#包括
int main()
{
int*数组[500];
int行,cols,num=0;
用于(行数=0;行数<500;行数++){
数组[行]=malloc(500*sizeof(int));
用于(cols=0;cols<500;cols++){
数组[行][cols]=num;
num++;
}
}
用于(行数=0;行数<500;行数++){
用于(cols=0;cols<500;cols++){
printf(“%d\n”,数组[行][cols]);
}
空闲(数组[行]);
}
返回0;
}

int
的500x500矩阵声明为局部变量时,如:

void somefunction() {
    int myarray[500][500];
    // ...
}
您需要1MB的堆栈(假设
sizeof(int)==4,这在x86上很常见)。在大多数编译器上,默认情况下堆栈大小限制为1MB是有充分理由的:检测可能的无限递归。事实上,堆栈达到1MB限制是非常不寻常的,因此我建议不要更改默认值

你有两种可能:

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

  • 处理多维数组有多种方法。最简单的方法是将其声明为数组数组:

    int array[X][Y];
    
    但是,正如我在评论中所说,如果声明为局部变量,这可能会导致堆栈溢出。如果它是全局变量,则没有问题(除非总大小太大,无法容纳系统的(虚拟)内存)

    另一种方法可能是将其声明为指向所需类型的指针数组,然后在循环中分配“第二个”维度:

    int *array[X];
    for (size_t i = 0; i < X; ++i)
        array[i] = malloc(sizeof(int) * Y);
    

    注意:当使用malloc等动态分配内存时,您需要
    释放
    内存,一旦使用完毕。

    int-array[500][500]
    ?但如果将其声明为局部变量,请小心,因为它将填充某些系统上的几乎所有堆栈(以及其他系统上可用的堆栈)YUP我做了它,它扔了编译时错误。它在GCC 4.6 +和Clang 3 +上工作。你的问题是你使用了一个年代久远的编译器,直接从90年代开始。除非你有一个令人信服的理由使用Turbc++,请下载一个象样的C++编译器。GCC,Clang,它们都是免费的。对于真正的初学者,像科德布洛也有不错的IDE。cks和DevC++.
    void main()
    应该是
    int main()
    int
    变量。但是冗余循环和
    void main()都不应该被声明
    是这里真正的问题。问题是TurboC++不应该在21世纪使用…全局的东西不起作用..知道原因吗?你使用的是什么编译器和标志吗?确切的错误消息是什么?它在GCC和Linux上运行。@ShubhamSaini
    static int myarray[500][500]我知道Turbo C++在印度的某些学校很常见,但是它已经过时了,很遗憾一旦你离开学校,你就没有用了。记住,它最初是为旧的MS-DOS制作的,它的使用非常(按今天的标准)。有限的分段内存,你不能真正地处理超过64千字节。抱歉,但是学习使用C++ Turbo C++程序只会阻碍你未来的职业。@舒巴哈辛尼关于你的错误,你真的无能为力,Turbo C++根本不能用在这样大的数据上,我试着把它声明成一个全局变量,B。ut错误保持不变..:(@ShubhamSaini您构建的是什么系统?您使用的是哪种编译器?更重要的是,数组使用的是什么类型?请编辑您的问题以包含这些信息,最好显示实际声明。@JoachimPileborg请参阅我答案的评论,OP使用的是TurboC++。我想他们从未遵守任何stan不管怎样,我真的很抱歉(
    
    int *array[X];
    for (size_t i = 0; i < X; ++i)
        array[i] = malloc(sizeof(int) * Y);
    
    int **array;
    array = malloc(sizeof(int*) * X);
    for (size_t i = 0; i < X; ++i)
        array[i] = malloc(sizeof(int) * Y);