2016-07-22 36 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]; 
} 
相关问题