c++一运行就自动退出了

不知道为什么一运行就直接退出了


#include 
using namespace std;
int main()
{
    int n, m, k;
    int ans=0;
    cout << "输入行数、列数、最大值" << endl;
    cin >> n >> m >> k;
    int a[500][500],s[500][500];//定义一个n行m列的矩阵
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            s[i][j] = s[i - 1][j] + s[i][j - 1] + a[i][j] - a[i - 1][j - 1];
        }
    }
    for(int up=1;up<=n;up++)
        for(int bu=up;bu<=n;bu++)
            for(int left=1; left <=m; left++)
                for (int right = left; right <= m; right++)
                {
                    int sum = s[bu][right] - s[up - 1][right] - s[bu][left - 1] + s[up - 1][left - 1];
                    if (sum <= k)
                        ans++;

                }
    
    cout << ans << endl;

    return 0;
}

(1)代码的问题
在第一个双层for循环中,给s[i[j]赋值的时候,i=0的时候s[i - 1][j]是 s[0][j],是一个未初始化的值,s[i][j - 1]和a[i - 1][j - 1]也是同样的问题,如果你想把他们的默认值设为0 的话,在声明变量的时候,把数组初始化一下:
int a[500][500]={0},s[500][500]={0};
(2)缓存大小的问题(一运行就终止的问题根源应该是这个原因
你的数组开的太大了,缓存不够用了。a和s数组一共占用内存大小:
250000 * 4 * 2 = 2000000字节 ,约为 1953 K >1M,一般默认缓存是1M,你代码里申请的空间超出1M了。
解决方法有两种,一是减小数组大小,比如int a[200][200];改成多大看你题目的要求
二是,修改一下编译器的保留堆栈大小,如果你用的是Visual Studio 编译器,修改方法如下图所示:

img

我这里不修改这个数值的话也是一运行就终止了,修改后可以正常运行。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632