为什么 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。
您可以初始化结构 circle
和 max_area
的值:
CIRCLE circle = {0,0,0,0};
CIRCLE max_area = {0,0,0,0};
我需要编写一个程序,从命令行给出的文件中读取数据,并在标准输出上打印圆面积的最大值。程序在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。
您可以初始化结构 circle
和 max_area
的值:
CIRCLE circle = {0,0,0,0};
CIRCLE max_area = {0,0,0,0};