迷途指针问题 可以正确运行但是我不能理解代码逻辑

img


第8行z接收局部变量a或b的地址,但是局部变量会在第8行调用完后释放存储空间,到第9行z不就变成迷途指针了吗,怎么还能通过*z间接引用?

因为堆栈没有新的数据写入,所以原来的内容还在那里。
在第九行,如果再调用一个函数,那么就可能覆盖掉了

楼上说的对, 确实会被后面函数调用覆盖. 甚至会被printf()调用改变.

#include <stdio.h>

int *max(int a, int b)
{
    return (a > b ? &a : &b);
}

int main()
{
    int x = 50;
    int y = 40;
    int *z = max(x, y);
    max(5, 10);
    printf("%d\n", *z);
    printf("%d\n", *z);
    return 0;
}

不是的,局部变量释放空间是在该变量所在代码块(即大括号)结束时,不会在第8行而会在第11行释放,所以可以引用。

【以下回答由 GPT 生成】

是的,我想要优化的问题是关于迷途指针的问题。我没有其他方面的问题需要优化。

首先,让我们分析一下代码中的问题。在函数max中,它返回了两个局部变量ab中较大数值的地址。然而,通过z = max(x, y)将这个地址赋值给了指针变量z,问题在于当max函数执行完毕后,ab这两个局部变量就被释放了,这意味着z指向的存储空间会被回收。

但是,为什么在第9行的cout << *z语句中,z指针仍然有效并且可以间接引用它所指向的值呢?这是因为在函数max中,返回的是一个指针值,而不是指针所指向的变量的值。当我们在main函数中将返回的指针值赋值给z指针后,z指向的地址仍然是有效的,尽管该地址指向的变量已经被释放。

为了解决这个问题,我们可以采取以下几个步骤来优化代码:

  1. 首先,我们可以修改max函数,使其返回值为引用而不是指针。这样可以确保在max函数执行完毕后,z指向的地址仍然有效。修改后的代码如下所示:
int& max(int& a, int& b) {
    return (a > b ? a : b);
}
  1. 接下来,在main函数中,我们需要修改赋值语句z = max(x, y),使其正确地将返回的引用值赋给z指针。修改后的代码如下所示:
z = &max(x, y);
  1. 最后,我们可以修改cout语句,以使用z指针进行间接引用。修改后的代码如下所示:
cout << *z;

综上所述,通过对代码的修改,我们可以避免迷途指针问题,并确保程序正常运行。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^