Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的指针在主函数中取消引用后与在自定义函数中取消引用时具有不同的值?_C++_Pointers - Fatal编程技术网

C++ 为什么我的指针在主函数中取消引用后与在自定义函数中取消引用时具有不同的值?

C++ 为什么我的指针在主函数中取消引用后与在自定义函数中取消引用时具有不同的值?,c++,pointers,C++,Pointers,为什么我的指针在主函数中取消引用后与在自定义函数中取消引用时具有不同的值 这可能很简单,但我想不出来。 代码如下: int *addNumbers(int a, int b); int main() { int no1 = 1; int no2 = 3; int no3 = 8; int *answer = &no3; answer = addNumbers(no1, no2); std::cout << answer << s

为什么我的指针在主函数中取消引用后与在自定义函数中取消引用时具有不同的值

这可能很简单,但我想不出来。 代码如下:

int *addNumbers(int a, int b);

int main()
{
    int no1 = 1;
    int no2 = 3;
    int no3 = 8;
    int *answer = &no3;

answer = addNumbers(no1, no2);
std::cout << answer << std::endl;
std::cout << *answer << std::endl;

/* Why does this second cout line not give the same 
answer as the second cout statement
 in the addNumbers function? */

}

int *addNumbers(int a, int b)
{
    int *resultPntr;
    int result = a+b;
    resultPntr = &result;
    std::cout << resultPntr << std::endl;
    std::cout << *resultPntr << std::endl;
    return resultPntr;
}

我认为解引用resultPntr和answer会给出相同的值???

addNumbers试图返回一个指向局部变量result的指针,该指针将在退出函数时被销毁。然后,main中的答案只是一个悬空指针,取消对它的引用意味着一切皆有可能。

您将返回一个指向结果的指针,该结果是addNumbers中的局部变量。 局部变量在他的范围内。所以当你从AddNumber退出时,它将被销毁

如果要获得相同的结果,需要执行以下操作:

int *addNumbers(int a, int b)
{
    int *resultPntr = new int;
    *resultPntr = a+b;
    std::cout << resultPntr << std::endl;
    std::cout << *resultPntr << std::endl;
    return resultPntr;
}
注意:当你用new声明新变量时,你最后需要删除它

addNumbers函数中的这一行:

int result = a+b;
resultPntr = &result;
std::cout << *resultPntr << std::endl;
...
return resultPntr;
正在尝试遵从addNumbers函数返回的指针。返回的指针包含一个内存位置,该内存位置曾经被addNumbers函数中的结果局部变量占用,现在由于返回main而被销毁,因此此类操作的结果未定义,并且您无法在addNumbers中传递给您获得的值


这就是为什么不应该从函数返回局部变量的引用或指针的一个很好的原因。

您返回的是指向局部自动变量的指针。取消对该指针的引用是未定义的。是不是有一条龙从你鼻孔里出来了?也许值得一提的是,该指针最终需要删除,或者改用智能指针。@songyuanyao谢谢你的提醒
answer = addNumbers(no1, no2);
std::cout << *answer << std::endl;