C++编程遇到的小问题

这个代码输入16以下的数字可以运行,16以上就不行了,请问为什么啊?


#include 
#include 
using namespace std;
int main()
{
    int i,j,n;
    cout<<"请输入层数:";
    cin>>n;
    int arr[n][n];
    arr[1][1]=1,arr[2][1]=1,arr[2][2]=1;
    for(i=3;i1;i++)
    {
        arr[i][1]=1;
        arr[i][i]=1;
        for(j=2;j-1][j-1]+arr[i-1][j];
        }
    }
    for(i=1;i1;i++)
    {
        int flag=1;
        for(j=1;j1;j++)
        {
            if(arr[i][j]==1 && flag==1)
            {
                cout<5*n-4*i)<0;
            }
            else
            {
                cout<8)<0;
}

前面的 循环中,arr 数组越界访问了,如下定义arr

int arr[n+1][n+1];

有啥问题?你把cmd窗口大小改大一点

该回答引用ChatGPT
这段代码使用了变长数组(Variable Length Array,VLA)来声明数组,即在数组声明时使用了变量 n,如下所示:

int arr[n][n];

但是,C++标准并不支持变长数组,所以这段代码在编译时需要使用编译器扩展。在某些编译器中,例如GCC,它支持变长数组,但是这个特性的使用是有限制的,其中之一就是变长数组的大小不能太大。在你的代码中,当你输入一个大于等于16的数字时,数组 arr 的大小将会超出编译器扩展的限制,导致程序崩溃。

为了避免这个问题,可以使用动态内存分配来代替变长数组,如下所示:

int **arr = new int*[n];
for (i = 0; i < n; i++) {
    arr[i] = new int[n];
}


这样就可以避免因为数组大小过大导致程序崩溃的问题了。同时,记得在程序结束时使用 delete 释放动态内存,以避免内存泄漏。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^