我使用我编写的函数遇到了意外行为,以计算一组3D点的平均点。
static inline Point3d
average_vertex_position( Vertex vertices[], int nPoints )
{
Point3d average = { 0.0, 0.0, 0.0 }; // Must be there to avoid accumulation
Point3d point;
int i;
for ( i = 0; i < nPoints; i++ )
{
point = vertices[i].position;
average.x += point.x;
average.y += point.y;
average.z += point.z;
}
average.x /= (double) nPoints;
average.y /= (double) nPoints;
average.z /= (double) nPoints;
return average;
}
// ...
Point3d average;
// ...
for ( j = i; j < nVertices; j++ )
{
// ...
average = average_vertex_position( vertices, nVertices );
// ...
}
对于每次迭代,average_vertex_position
的返回值将累积,除非我明确添加了初始化Point3d average = { 0.0, 0.0, 0.0 };
。
如果之前的返回值为Point3d( 10, 0, 20 )
且下一次运行应返回Point3d( 20, 10, 0 )
,则会返回累积结果Point3d( 30, 10, 20 )
。
最初我只有Point3d average;
假设所有成员值(double
值)都将初始化为0.0。我还假设average
在每次调用之间都处于这种初始状态。我不明白为什么我需要明确初始化它?
我删除了我认为不相关的代码 - 但我可能错了,在这种情况下,如果它没有足够的信息,我会更新。
答案 0 :(得分:3)
auto
变量是正常的 - 如果没有明确说明,它们不会初始化为0.
重复使用旧值这一事实纯属巧合,因为您之间没有任何其他函数调用。如果你有它们,给定堆栈位置的内存将被覆盖,你的值也不同。