【问题标题】:Local variable values and Address getting retained even after function completes Execution [closed]即使在函数完成执行后,局部变量值和地址也会保留[关闭]
【发布时间】:2018-01-09 16:32:38
【问题描述】:
#include<stdio.h>
int main()
{
        int var=100;
        int *ptr=&var;
        fun(&ptr);
        printf("%p",ptr);
        printf("%d\n",*ptr);
}
int fun(int **var)
{
    int j=10;
    *var=&j;
    printf("%p\n",*var);
    printf("%d\n",**var);
}

输出:

0x7fff2c96dba4 10 0x7fff2c96dba4 10

如何在函数完成执行后保留价值? 我在 gcc 中执行了几次,在在线编译器中它给出了相同的结果。 请帮助我理解这一点...提前致谢。

【问题讨论】:

  • 返回(以一种或另一种方式)指向具有自动存储持续时间 j 的对象的指针,并在对象超出范围后访问该对象有undefined behaviour:“对象被外部引用其生命周期 (6.2.4)。使用指向生命周期已结束的对象的指针的值 (6.2.4)。所以这是 2 次 UB。
  • 您也永远不会从非 void 函数返回值。
  • @ChristianGibbons btw,这 不是 UB,而是非常标准的符合行为
  • @llija Everila 谢谢您的回复.. 但我没有得到它的是即使在函数完成后它也会打印值。它会被存储一段时间还是未定义的行为(UB)
  • 这是c++,但适用相同的概念:底线,未定义的行为未定义,定义为失败。仅仅因为它这次“有效”并不意味着它总是会。 stackoverflow.com/questions/6441218/…

标签: c function pointers double-pointer


【解决方案1】:

如何在函数执行完成后保留价值?

未定义的行为 (UB)。它可能看起来“有效”,但 C 并未指定这样做。

fun(&amp;ptr); 运行良好,但 printf("%p",ptr); 是 UB,因为值 ptr 不再有效。许多系统会容忍这种 UB。

printf("%d\n",*ptr); 去引用ptr 是更糟糕的UB。更有可能表现得不好。最好不要尝试其中任何一种。

【讨论】:

    【解决方案2】:

    值没有被保留,方法'fun'*将主变量'ptr'指向的地址设置为fun变量J的地址,本质上是复制地址*var=&j,但这并不意味着它仍然指向'j'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      相关资源
      最近更新 更多