溢出或内存错误c++

Overflow or Memory error c++

本文关键字:c++ 错误 内存 溢出      更新时间:2023-10-16

这可以被认为是一个家庭作业问题。这个问题是众所周知的:"你有一个三角形的数字,你必须找到最大的和"

好吧,没问题,我前段时间在python中做了一个解决方案,完美无瑕。但现在在c++中,解决方案是75256,我的答案是9729。所以问题是类型short溢出。

因此,为了解决这个问题,我假设将数组更改为int类型可以解决所有问题。。但是当声明一个数组a[1001][1001]时它就冻结了(我猜是内存错误)。

有人知道该怎么办吗?我尝试了另一个int,每当a中的值大于32767时,它就会增加,但我的解决方案仍然是300?(代码有效-在许多较小的代码上测试)

#include <iostream>
#include <fstream>
int main() {
    std::ofstream fout ("numtri.out");
    std::ifstream fin  ("numtri.in");
    short trifield[1001][1001] = {0};
    int Rows, tmp=0;
    fin >> Rows;
    for (int x = 0; x<Rows;x++) 
        for (int nr = 0; nr<=x;nr++){
            fin >> tmp;
            trifield[x][nr] = tmp;}
    for (int y = (Rows-2); y > -1; y--)
        for (int x = 0; x <= y+1; x++) {
            int a = trifield[y+1][x];
            int b = trifield[y+1][x+1];
            if (a > b) trifield[y][x] += a;
            else       trifield[y][x] += b;
        }
    fout << trifield[0][0] << std::endl;
    return 0;    
}

注意:我不是在寻找解决方案,只是一个处理溢出的好方法,示例不胜感激!

如果内存有问题,请尝试动态分配数组:

short** trifield = new short[1001][1001];

您有一个1001x1001短裤的数组。。。就是1002001*2个字节。这些都在你的本地堆栈上。根据您的系统,它可能太大。试着用malloc为您的"trifield"分配空间。看看这对你有什么帮助

您得到的是堆栈溢出,而不是数字溢出!

将数组移动到main之外的静态内存中,这样它就不会使用堆栈。

我检查溢出的方法是检查明显虚假的结果。例如,

if (myInt + 1 < myInt) {
    // Overflow condition
    cerr << "Overflow" << endl;
}
else {
    myInt++;
}

溢出的int是UB。标准中定义了溢出的无符号int值。

因此,唯一的方法是在执行操作之前手动检查值,并确保它不会溢出。