无法理解让我们来C静态存储类的例子
我无法理解Yashwant Kanetkar的“让我们C”中的一个例子。 这是代码片段:
main() { int *j; int *fun(); j = fun(); // If we add a function call here, the print statement prints a garbage value. printf("\n%d",*j); } int *fun() { int k = 35; return (&k); }
现在在上面的代码中,我无法理解为什么在printf语句导致打印垃圾值之前调用函数。 我有一个模糊的想法,因为返回的值指向堆栈中的内存位置,在打印此值之前调用另一个函数时会出现问题。 但我无法清楚地看到这里发生的事情。 请帮忙。
在你的代码中
int *fun() { int k = 35; return (&k); }
你从fun()
返回一个局部变量的地址。 任何返回值的使用都会导致未定义的行为 。
为了解释,一旦函数fun()
完成执行,就不存在k
。 因此,尝试使用像&k
这样的东西是无效的。
注意:无论在特定书籍[与堆栈刷新等有关]中提供的解释是什么,都没有在c中标准化。
int k = 35;
函数fun()
是本地的,所以一旦你从fun()
返回,为k
分配的内存不再有效,你返回&k
(该变量的地址)将导致未定义的行为