这个函数是在我的程序中实现的,但是当它被调用时会出现一个错误,说变量root是在没有被初始化的情况下使用的,有什么原因吗?
int find(int x)
{
int i, j, root;
for (i = x; parent[i] != i; i = parent[i])
root = i;
/* path compression */
for (i = x; parent[i] != i; j = parent[i], parent[i] = root, i = j)
{
//donothing
}
return root;
}
答案 0 :(得分:0)
这正是它所说的。如果parent[i] != i
在开始时为false,则会在未初始化的情况下读取root
。
答案 1 :(得分:0)
编译器无法确保root
将被初始化,因为对它的所有引用都在for
循环内,如果不满足条件,则可能不会执行一次。
root=x
; i
应该在for
循环中声明以正确限制其范围答案 2 :(得分:0)
如果parent[x] == x
会怎样?双循环实际上会运行,因为条件parent[i] != i
将为false(因为i = x
),因此root
实际上永远不会设置为值。
所以,当我们返回root
时,它的值是未定义的,这意味着它可以是任何。
最简单的方法是在循环之前将root
设置为某个初始值,例如0
。
答案 3 :(得分:0)
因为你正在做
for (i = x; parent[i] != i; i = parent[i])
root = i;
所以在你的代码中你告诉我i = x而不是root = i 或者你还没有说明x的值是多少!那么编译器如何知道root的值? 你应该在for!
中使用之前初始化X.