打印文本导致记忆问题

问题描述:

我做一个程序来解决矩阵,当我试图调试我写了这样的代码:打印文本导致记忆问题

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在该行通过时开始返回随机的大数字。它应该是像Max 2.5

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

+2

你没有初始化'sum'。这导致未定义的行为。在C++中默认情况下,变量不会初始化为零。 –

+0

sum自动初始化为0,所以这没什么大不了的 – Ginko

+2

@Ginko - Sum **在** not **时自动初始化。它是一个局部变量,因此它包含任何随机垃圾,并且是的,0与其他任何垃圾值一样随机。 – PaulMcKenzie

的问题是这一行:

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

知道cout语句如何影响未初始化的局部“总和”的垃圾值会很好。我不清楚。虽然我猜这是另一个问题。 – Zebrafish

+0

通过添加或删除代码行(它不必是'cout'行),您正在更改可执行映像。更改编译器选项,您又可能会看到不同的行为。 – PaulMcKenzie