【问题标题】:Printing text causes memory issue打印文本会导致内存问题
【发布时间】:2016-12-28 20:47:55
【问题描述】:

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

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

有趣的是,当我把 cout 指令放在那里时,我的结果完全改变了,它开始返回随机的大数字,比如01.55e+2311。当我删除该 cout 指令时,结果是正确的。我可以以某种方式解决这个问题,但我想知道这种行为的原因是什么。此外,当我执行 'cout &lt;&lt; "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 &lt;&lt; row[first_nz]cout &lt;&lt; sum_nz_el(row, size) 时(无论哪种情况,两种情况都会出现问题),当该行通过时,函数 sum_nz_el 开始返回随机的大数字。应该是 max 2,5

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

【问题讨论】:

  • 你没有初始化sum。这会导致未定义的行为。在 C++ 中,变量默认不会初始化为零。
  • sum自动初始化为0,所以没什么大不了的
  • @Ginko -- not 中的总和已自动初始化。它是一个局部变量,因此它包含任何随机垃圾,是的,0 与任何其他垃圾值一样随机。
  • 这是一件很奇怪的事情。将 sum 初始化为 0 以某种方式解决了它,但它产生的结果与我不这样做的结果相同,尽管它现在不管放置 cout 指令都可以工作
  • @Ginko -- 这并不奇怪。如果未初始化,C++ 中的局部变量以随机垃圾开头。不初始化可能是0、-1、4325、89、-67,你不知道。粘贴cout 行只会更改二进制图像,因此您会得到一些其他垃圾值作为起始值。

标签: c++


【解决方案1】:

问题是这一行:

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);
}

【讨论】:

  • 很高兴知道 cout 语句如何影响未初始化的本地“sum”的垃圾值。我不清楚。虽然我猜这是另一个问题。
  • 通过添加或删除代码行(它不必是cout 行),您正在更改可执行映像。更改编译器选项,您可能会再次看到不同的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2013-09-22
相关资源
最近更新 更多