在C中返回地址

Kun*_*asu 1 c c++ pointers pass-by-reference

为什么这段代码会产生意外的输出.

int * func(int *xp)
{
    int y = 10 + *xp;
    return (&y);
}
void main()
{
    int x = 10;
    int *xp = func(&x);
    printf("%d\n", x);
    printf("%d\n", *xp);
}
Run Code Online (Sandbox Code Playgroud)

预期产量:

10
20
Run Code Online (Sandbox Code Playgroud)

实际输出:

10
1074194112
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 11

您将返回一个指向变量(y)的指针,该变量在您离开时超出范围func.这是未定义的行为.

目前还不完全清楚你要实现的目标,但有几种方法可以解决这个问题:

  1. 返回intby值;
  2. 修改*xp到位,不要退货;
  3. 获取一个额外的int*参数并将结果存储在那里(再次返回void);
  4. 使用malloc或在堆上分配内存new并返回(调用者将负责正确释放该内存).

如果不了解更广泛的背景,就无法说出上述哪一项适用于您的问题.

最后,main()应该返回int(感谢@pmg发现这一点).这与您遇到的问题无关,但值得指出.