函数局部变量在函数调用之间持续存在

时间:2016-07-22 17:52:05

标签: c++ mbed

我在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不是静态的,为什么它在函数调用之间持续存在?感谢

2 个答案:

答案 0 :(得分:3)

&#34;持久性问题&#34;是sum未初始化使用,因此导致未定义的行为。但是,在您的情况下,sum被分配在内存中与先前调用期间相同的位置,从而产生了#34;持久性&#34;的幻觉。

请注意,您的编译器可能已向您发出警告,您不应忽略该警告。

通过在使用变量之前添加初始化来解决此问题:

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

答案 1 :(得分:0)

当您从未初始化的变量中读取时,您有UB,并且讨论未定义行为的特定副作用几乎没用。