【问题标题】:Default parameters for a function in C --C中函数的默认参数——
【发布时间】:2012-11-20 17:34:32
【问题描述】:

我是初学者,如果我违反了任何规则,敬请见谅。这是我的问题。

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

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

void traverse(Tree *t)
{
..
}

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

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

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

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

我尝试在 Google 上四处查看,但尚未找到确定的来源。

感谢您的宝贵时间。 :)

【问题讨论】:

  • 这是不正确的,“有效”只是偶然。 C 没有默认参数。

标签: c gcc compiler-construction


【解决方案1】:

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

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

所以,它的工作纯属偶然。

【讨论】:

  • 谢谢。是的,这就是我的怀疑。
  • 一个问题,不过。您提到的这个“堆栈”。在计算过程中存储变量的堆栈是什么?我的意思是,我知道堆栈用于:1)函数调用(调用堆栈)(显然不在此处的图片中),以及 2)此堆栈用于汇编级指令。您指的是#2“堆栈”吗?程序的汇编代码运行时实现的栈?
  • 答案是指激活栈,也称为调用栈。它是一种抽象,而不是内存中的实际堆栈(尽管它的某些部分实际上存储在内存中的实际堆栈中)。每次调用函数(包括对 main 的初始调用)时,都会将包含局部变量和一些其他信息(例如调用位置)的激活记录推送到激活堆栈上。
  • 在某些机器架构上,尤其是在使用愚蠢的编译器时,激活记录实际上完整地存储在机器堆栈中。现代机器和好的编译器尽可能避免使用实际堆栈;您的局部变量 t 很可能存储在机器寄存器中,而该寄存器恰好是被调用函数期望在其中找到其参数的寄存器。
  • 谢谢,同上。这澄清了我的问题。
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 2012-02-26
  • 2012-03-22
  • 2012-03-26
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多