通过引用(在C中)将参数传递给另一个函数是否安全?
以下代码是否安全且可移植?
void funcB(int *pA)
{
// Do something w/ pA
}
void funcA(int a)
{
funcB(&a);
// Do something else w/ a
}
我的理解是,在许多系统上,函数参数被放置在 CPU 寄存器中而不是堆栈中。因此,您实际上是将寄存器的地址传递给函数,然后将其内容推送到堆栈中,以便可以将寄存器用于funcB. 因此,实际上,当您取消引用pAin 时funcB,您将获得地址pA而不是afrom的内容funcA。我的推理是正确的还是我完全偏离了基地?
回答
是的,根据 C 标准完全安全且定义明确。函数参数是一个对象,并且(概念上)它有一个地址。funcB通过指针访问该对象是安全的。请记住,与 中的任何其他局部变量一样funcA,它的生命周期在funcA返回时结束,因此funcB应该小心存储指针pA以供以后使用。
在幕后,即使在寄存器中a传递funcA,如果需要它的地址,那么编译器将需要将该寄存器复制到堆栈上(称为“溢出”),传递该堆栈位置的地址,并使用来自用于进一步操作的地址a。(或者,生成行为“好像”已完成的代码。)
非优化编译器通常总是将参数溢出到堆栈中,因此无论是否需要,它都确实有一个地址。但是如果不需要地址,优化器可以去掉它并将参数留在其寄存器中。