我在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 :(得分: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,并且讨论未定义行为的特定副作用几乎没用。