2016-12-28 65 views
1

我做一個程序來解決矩陣,當我試圖調試我寫了這樣的代碼:打印文本導致記憶問題

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

回答

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

知道cout語句如何影響未初始化的局部「總和」的垃圾值會很好。我不清楚。雖然我猜這是另一個問題。 – Zebrafish

+0

通過添加或刪除代碼行(它不必是'cout'行),您正在更改可執行映像。更改編譯器選項,您又可能會看到不同的行爲。 – PaulMcKenzie