为什么 Valgrind 报告我使用了未初始化的值,而条件跳转或移动取决于未初始化的值?

Why does Valgrind report me use of uninitialised value and conditional jump or move depends on uninitialised value?

我需要编写一个程序,从命令行给出的文件中读取数据,并在标准输出上打印圆面积的最大值。程序在gcc下编译无任何错误。但是 Valgrind 向我报告了很多关于 "Use of uninitialised value of size 8" 和 "Conditional jump or move depends on uninitialised value(s)" 的错误。我怀疑这是因为 struct CIRCLE 中的可变区域,但无法弄清楚如何解决该问题。

结构原型:

typedef struct { double x, y, r, area; } CIRCLE;

面积计算的函数原型:

int compute_circle_area(CIRCLE * circle, CIRCLE * max_area)

函数代码:

circle->area = pow(circle->r, 2) * PI;
max_area->area = pow(max_area->r, 2) * PI;
return circle->area > max_area->area ? 1 : 0;

主要函数原型:

int main(int argument_count, char ** argument_vector)

函数代码:

FILE * stream;
CIRCLE circle;
CIRCLE max_area;
if((stream = fopen(* (argument_vector + 1), "r")) != NULL)
{
    while((fscanf(stream, "(%lf, %lf, %lf)\n", &circle.x, &circle.y, &circle.r)) == 3)
    {
        if(++counter == 1) max_area = circle;
        else
        {
            if(compute_circle_area(&circle, &max_area)) max_area = circle;
        }
    }
    fclose(stream);
}
printf("Circle with the largest area: \n");
printf("(%lf, %lf, %lf), Area: %lf", max_area.x, max_area.y, max_area.r, max_area.area);
return 0;

我还有一个全局static int counter = 0来操作第一个循环来设置max_area为circle。

您可以初始化结构 circlemax_area 的值:

CIRCLE circle = {0,0,0,0};
CIRCLE max_area = {0,0,0,0};