0

我希望结果是未定义的,但输出是“10”,为什么?

我想在函数被调用后内存被破坏了。

#include <iostream>
void f(int *p)
{
    int l = 20;
    int *k = &l;
    p = k;
}
int main()
{
    int i = 10;
    int *j = &i;
    f(j);
    std::cout << *j;
    return 0;
}
4

5 回答 5

5

结果不是未定义的。j 您通过value传递指针,因此您在函数内修改它的副本。原件j保持不变,所以结果仍然是10.

于 2012-11-09T09:54:26.987 回答
1

该程序结构良好,因为在外部没有访问局部变量l因为指针f()jmain()指针的副本j被传递到f())中没有改变。

于 2012-11-09T09:54:44.100 回答
1

让我们分解你的代码。

您首先将 10 分配给i. 然后j指出 的地址i

在 f 中,您将 的值p不是它指向的值设置为k。作为 的参数传递f(),p 值被复制(地址值)。

因此,您永远不会修改 所指向的值,只是inj的局部值,这就是它保持等于 的原因。jf()10

于 2012-11-09T09:55:01.133 回答
1

There is absolutely nothing wrong with the code. The parameter of f is not passed by reference, so f has no way to modify j, therefore j still points to i after f exits.

于 2012-11-09T09:55:49.173 回答
0

您对按引用传递/按值传递感到困惑。当你传递一个指针时,指针本身是一个数字,你传递给f()指向一块内存的函数;修改 *p 变量f()(而不是*p指向的内存块)对main()函数没有影响。

A pointer is just a variable that holds an address of memory. In itself, it is passed by value; only the variable to which the pointer points is passed by reference.

于 2012-11-09T09:55:02.083 回答