我的问题在下面的代码段中的代码注释中标记。
int *foo(){
int a = 10;
int b = 20;
return &b;
}
int *foo2(){
int aa = 44;
int bb = 40;
return &bb;
}
int main(int argc, char* argv[])
{
int *p = foo();
int *p2 = foo2();
int a = 700;
int *b = & a;
// cout<<*b<<endl; /* what & why the difference from adding & removing this line?? */
cout<<a<<endl;
cout<<*p<<endl; /* what & why happened to "p" */
return 0;
}
答案 0 :(得分:5)
在foo()
和foo2()
中,您将返回指向局部变量的指针。这些本地人具有自动存储,并且未定义行为一旦超出范围就使用指向它们的指针。因此p
和p2
没有任何用处。它可能有效,但可能没有。
我无法理解你的问题,所以我希望我能得到这一切。
答案 1 :(得分:1)
在我尝试回答您的代码段评论中的问题之前,让我们逐步完成:
int *foo(){
int a = 10;
int b = 20;
return &b;
}
int *foo2(){
int aa = 44;
int bb = 40;
return &bb;
}
int main(int argc, char* argv[])
{
int *p = foo();
int *p2 = foo2();
在foo()
和foo2()
中,您将返回指向函数调用堆栈中某些内容的指针(即a
,b
,{{1 }}和aa
),当函数返回时会消失。在函数内,指向bb
中变量a
或b
的指针或指向foo()
中变量aa
或bb
的指针将指向某事物有效的。
但是当函数返回时,这些变量将不复存在。因此,在这两个函数中,返回的指针都无效,因此foo2()
和p
也将无效。
p2
您要将变量 int a = 700;
int *b = &a;
的地址指定给指针a
。
b
添加该行将取消引用// cout<<*b<<endl; /* what & why the difference from adding & removing this line?? */
并打印出指针的值(在本例中,变量b
的值为700)。
a
由于 cout<<*p<<endl; /* what & why happened to "p" */
无效,如前所述,它将调用未定义的行为,这意味着任何都可能发生。这可能包括它正常工作(我怀疑),打印垃圾值,直接崩溃或爆炸您的计算机。只是不要试图取消引用无效指针。