【发布时间】:2021-07-17 04:25:53
【问题描述】:
我知道我们何时将局部变量地址返回给调用者。它变得悬空。为了解决这个问题,我们需要使用静态。这里 x 超出了范围,因此出现了问题。
int *fun()
{
// x is local variable and goes out of
// scope after an execution of fun() is
// over.
int x = 5;
return &x;
}
int main()
{
int *p = fun();
// p points to something which is not
// valid anymore
printf("%d", *p);
return 0;
}
为什么当我们返回 x 的值而不是它的地址时这不是问题。在这种情况下,x 的值也是局部的,并且在 p 的调用者中,值应该是垃圾,因为局部变量 x 范围结束。
int fun()
{
int x=5;
return x;
}
main()
{
int p;
p = fun();
printf("%d", p);
}
【问题讨论】:
-
返回给调用者的是
x的副本,而不是x本身。 -
这样的事情最好通过查看汇编代码来理解。您可以使用
-S选项从 gcc 或 clang 请求程序集。在大多数处理器上,您会看到fun()将 5 放入寄存器,main在该寄存器中查找返回值。 -
'为了解决这个问题,我们需要使用静态'不,你真的不需要。这就是 strtok() 的设计者的想法……无论问题是什么,“静态”都不是答案。