为什么我的指针在我在自己的自定义函数中取消引用它之后取消引用它时,我的指针有不同的值?
它可能非常简单,但我无法弄明白。 以下是代码:
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会给出相同的值??
答案 0 :(得分:8)
addNumbers()
正在尝试返回指向局部变量result
的指针,该函数将在退出函数时被销毁。然后answer
中的main()
只是一个悬垂的指针,取消引用它是UB,意味着一切皆有可能。
答案 1 :(得分:1)
您正在返回/*
* Add Ajax to the Country select box html output
*/
$url = Mage::getBaseUrl();
$country->setAfterElementHtml("<script type=\"text/javascript\">
function getstate(selectElement){
var reloadurl = '".$url.'admin/customer/state/' . "country/' + selectElement.value;
new Ajax.Request(reloadurl, {
method: 'POST',
onComplete: function(){
},
success: function (response) {
alert(response)
}
});
}
</script>");
中指向result
的指针,该指针是addNumbers
中的局部变量。
本地变量生活在他的范围内。所以当你从addNumbers
退出时会被销毁!
如果您想获得相同的结果,您需要这样做:
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;
}
N.B。当您使用 new
声明新变量时,最后需要delete
。
答案 2 :(得分:1)
addNumbers()
函数中的这一行:
int result = a+b;
resultPntr = &result;
std::cout << *resultPntr << std::endl;
...
return resultPntr;
显示作为局部变量的result
变量的值。由于result
是一个局部变量,因此它的范围与定义的函数有关,这意味着当函数返回main
时它将不再可用。
在main
:
answer = addNumbers(no1, no2);
std::cout << *answer << std::endl;
尝试从addNumbers()
函数中推断返回的指针。返回的指针包含一个内存位置,该位置曾被result
函数中的addNumbers()
局部变量占用,现在由于返回main
而被销毁,因此结果为这样的操作是未定义,你不能在它上面传递给你在addNumbers()
里面时获得的价值。
这是为什么不应该从函数返回局部变量的引用或指针的一个很好的理由。