2016-07-22 79 views
1

我寫了一個MBED LPC1768一個簡單的點產品功能:功能函數之間的局部變量仍然存在調用

float dotProduct(float a[], float b[], int length){ 
    float sum; 
    int i; 
    for (i = 0; i < length; i++){ 
     sum = sum + a[i]*b[i]; 
    } 
    return sum; 
} 

我在我的程序兩次調用dotProduct在一排(測試)點兩個128元1矢量({1,1,1 ... 1})並將它們打印爲串行。所以預期的結果應該是128和128.然而,變量sum似乎仍然存在,但是,因爲我得到了128和256.此外,如果我將float sum聲明更改爲float sum = 0,我得到128和128所需的結果。變量sum不是靜態的,爲什麼它在函數調用之間持續存在?謝謝

+0

您使用未初始化的變量 - >結果不確定的行爲。 –

回答

0

當你從一個未初始化的變量讀取UB時,你有UB,它幾乎沒有用來討論你的未定義行爲的特定副作用。

3

「持久性」的問題是sum未初始化,因此導致未定義的行爲。然而,在你的情況下,sum被分配到先前調用期間內存中的相同位置,從而產生了「持久性」的錯覺。

請注意,您的編譯器可能已向您發出警告,您不應該忽略它。

修復此問題,通過使用之前加入初始化的變量:

float sum = 0; 
for (int i = 0; i < length; i++){ 
    sum = sum + a[i]*b[i]; 
} 
相關問題