2

我的函数原型是这样的。

int * f4(int parm);

我的功能看起来像这样

int * f4(int parm)
{
    return &parm + 1;  
}

我的返回类型是否正确?因为当我调用该函数时它什么也没做。

这是我的电话

int *pointer1;
pointer1 = f4(319);
cout << pointer1 << endl;

它返回指针的地址,但我需要它来返回值,但我似乎无法让它工作。

使用

cout << *pointer << endl;

只显示 0

4

2 回答 2

6

问题是对象parm是该函数的本地对象。在函数调用结束后获取并保留(即返回)指向它的指针是不合法的。

换句话说,parm当函数存在时“活着”。当函数返回其所有本地对象(如parm)“死”。

正如crush评论中的注释,pointer1成为无效指针,也被亲切地称为“悬空”指针。

所以请展示正确的方法!

根据要求,有几种方法可以“正确”执行此操作:

  • 直接返回parm + 1,改变函数的返回类型。听起来你真的不需要指针

  • 将参数作为指针(或引用,这是 C++)并递增其指向的值。如果您愿意,您也可以返回它 - 返回它是有效的,因为它来自函数外部

  • 添加一个 staticstatic int sparm; sparm = parm + 1并返回一个指向sparm. 这将使您的函数不可重入,但它会起作用:static函数调用结束时对象不会死

  • 为指针分配(呃!不要!)一些内存并返回它


仔细阅读代码后,很明显指针永远不会有效。从一开始,它就超出了可用内存的一个插槽parm

于 2013-09-11T20:52:36.663 回答
3

返回指向局部变量的指针是个坏消息。 parm是一个函数参数,对于f4. 您正在向调用者返回一个错误的指针,然后尝试取消引用它。那只会以泪水告终。

于 2013-09-11T20:52:30.680 回答