【发布时间】:2021-07-16 01:50:03
【问题描述】:
以下代码安全且可移植吗?
void funcB(int *pA)
{
// Do something w/ pA
}
void funcA(int a)
{
funcB(&a);
// Do something else w/ a
}
我的理解是,在许多系统上,函数参数被放置在 CPU 寄存器中,而不是堆栈中。因此,您实际上是将寄存器的地址传递给函数,然后将其内容压入堆栈,以便寄存器随后可用于funcB 的参数。因此,实际上,当您在 funcB 中取消引用 pA 时,您将获得地址 pA,而不是来自 funcA 的 a 的内容。我的推理是正确的还是我完全脱离了基础?
【问题讨论】:
-
你心目中的系统是什么?你是如何编译代码的?
-
这就是定义的所有实现,而不是您应该担心的事情。它将与平台不同。而且您的代码是合法的,因此无需担心。对 (*pA) 所做的更改将在 funcA 中看到
-
在
C中你只有指针传递,与C++相反,它有指针和引用,而java只有引用(java中的所有对象都是通过引用传递的)。
标签: c