打印文本会导致内存问题

时间:2016-12-28 20:47:55

标签: c++

我正在做一个解决矩阵的程序,当我尝试调试时,我编写了这样的代码:

double* row = matrix[i];
int first_nz = get_first_nz_el_idx(row, size);
cout << row[first_nz];

有趣的是,当我把那个cout指令放在那里时,我的结果完全改变,它开始返回随机,大数字,如01.55e+2311。当我删除该cout指令时,结果是正确的。我可以以某种方式解决这个问题,但我想知道这种行为的原因是什么。此外,当我做cout << "anything";同样的问题时。但是,当我调用其他函数如pow(3, 2)时 - 它没有错。

有一个函数,它对传递的行中的一些元素进行求和:

double sum_nz_el(double* row, int size)
{
    int first = get_first_nz_el_idx(row, size) + 1;
    int last = size - 1;
    double sum;
    if (first > size - 2)
        return 0;
    while (first < last)
    {
        sum += row[first];
        first++;
    }
    return sum;
}

int get_first_nz_el_idx(double* row, int size)
{
    int i = size - 2;
    while (!(row[i - 1] == 0 || i == 0))
        i--;
    return i;
}

当我执行cout << row[first_nz]cout << sum_nz_el(row, size)时(在两种情况下都出现问题并不重要),函数sum_nz_el开始返回随机的大数字,当行已通过。它应该像最大2,5

行可能是这样的: 0 0 0 23 41 11

1 个答案:

答案 0 :(得分:2)

问题是这一行:

double sum;

此变量是本地变量,因此未初始化。它从垃圾值开始。垃圾值可以是任何东西,包括0.此外,您无法通过删除或添加不相关的代码行(如您提到的cout语句)来预测垃圾值可能是什么,甚至“控制它”。 。

要解决此问题,您只需简单地初始化变量:

double sum = 0.0;

此外,如果您使用算法函数std::accumulate

,则不需要该循环
#include <numeric>
//..
double sum_nz_el(double* row, int size)
{
    int first = get_first_nz_el_idx(row, size) + 1;
    int last = size - 1;
    if (first > size - 2)
       return 0;
    return std::accumulate(row + first, row + last, 0.0);
}