1

我是初学者,如果我违反任何规则,请道歉。这是我的问题。

我在 Codeblocks 上使用 GCC 编译器,我注意到一段特殊的代码片段有一些特殊之处。我希望有人可以对此有所了解。

int main()
{
Tree *t;
//some operations on the tree
traverse();// No parameter is passed here.
...
}

void traverse(Tree *t)
{
..
}

在以下代码中,函数 traverse() 正确执行。我的问题是为什么?我不确定这一点,但是如果未声明函数,则其默认类型将变为 int。现在,编译器不仅在编译时抑制了错误,而且还正确地为函数 traverse() 提供了参数“t”。

这是因为智能编译器设计吗?

所以总的来说:我的问题是 - 如果编译器遇到尚未声明的方法,它会默认采取什么行为?更重要的是,它如何“知道”我想传递哪个参数?

如你所知,我可以拥有三个“Tree *”实例:t1、t2 和 t3。那么编译器会通过哪一个呢?

我试着在谷歌上四处寻找,但还没有找到明确的来源。

感谢您的时间。:)

4

1 回答 1

3

该函数正在堆栈上寻找它的参数。该函数不知道它所期望的参数实际上并不存在。

碰巧的是,堆栈中查找参数的地方是函数中的局部t变量main()。如果您在 内部有更多局部变量main(),那么其中一个变量会被误解为函数的参数,事情就会大错特错。

所以,它的工作纯粹是偶然的。

于 2012-11-20T17:36:10.990 回答