这个代码输入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 释放动态内存,以避免内存泄漏。
不知道你这个问题是否已经解决, 如果还没有解决的话: