【问题标题】:C++ - Pointer to local variable in Google's exercise codeC++ - 指向 Google 练习代码中的局部变量的指针
【发布时间】:2020-04-22 05:29:32
【问题描述】:

Here,在练习#1中,有一个函数HardToFollow

void HardToFollow(int *p, int q, int *num) {
    *p = q + *num;
    *num = q;
    num = p;
    p = &q;
    Unknown(num, *p);
}

倒数第二行使p 指向q,这是一个局部变量(参数的副本)。指向局部变量的指针。

稍后,在 main 函数中,作为第一个参数传递的指针在调用之后使用。这不应该是未定义的行为吗?在调用HardToFollow() 之后,作为第一个参数传递的指针不应该是未定义的吗?

编辑:我明白这不是未定义的行为,可以更改指针本身而不反映传递参数的行为,只有对指向值的更改是永久性的。

【问题讨论】:

  • 函数有问题,p 只是一个指针,虽然你可以在函数中更改指针的内容,但你不能更改它所指向的内容并在退出时获取新地址功能。解决这个问题的方法是改变:int p to int* p,然后在你的函数中分配给内容:**p = q + *num; *p = &q;未知也必须采取**p

标签: c++ pointers local-variables


【解决方案1】:

请记住,默认情况下所有参数都是按值传递的。这意味着传递的表达式的值被复制到函数的局部参数变量中。这也意味着改变参数变量(比如赋值给它)只会改变局部参数变量本身,而不是调用函数时使用的原始值。

这就是这里发生的事情:有人调用HardToFollow 函数并传递一个指针。该指针的值被复制到局部参数变量p。而对p 本身的任何赋值只会修改局部变量p

所以不,这不会导致 UB,它是完全有效的。

【讨论】:

  • 是的,我在你回答前几分钟就想到了。不过,谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2014-05-18
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多