Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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 *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 *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;
}
int*foo(){
INTA=10;
int b=20;
返回&b;
}
int*foo2(){
int aa=44;
int-bb=40;
返回&bb;
}
int main(int argc,char*argv[])
{
int*p=foo();
int*p2=foo2();
INTA=700;
int*b=&a;
//cout在
foo()
foo2()
中,您正在返回指向局部变量的指针。这些局部变量具有自动存储功能,一旦它们超出范围,使用指针指向它们是未定义的行为。因此
p
p2
没有任何有用的内容。它可能有效,也可能无效


我不能很好地理解您的问题,所以我希望我能全部理解。

在我尝试回答您代码片段注释中的问题之前,让我们先来了解一下:

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
aa
bb
),当函数返回时,这些对象将消失。函数中有一个指向
foo()中变量
a
b
的指针
foo2()
中指向变量
aa
bb
的指针将指向有效的内容

但是当函数返回时,这些变量将不再存在。因此,在这两个函数中,返回的指针将无效,因此
p
p2
也将无效

    int  a = 700;
    int *b = &a;
您正在将变量
a
的地址分配给指针
b

//  cout<<*b<<endl; /* what & why the difference from adding & removing this line?? */

由于
p
如前所述是无效的,它将调用未定义的行为,这意味着任何事情都可能发生。这可能包括它工作正常(我对此表示怀疑),打印垃圾值,彻底崩溃,或使计算机崩溃。只是不要尝试取消对无效指针的引用。

这是什么我甚至不知道?糟糕的编程实践就是这一点。这很可能是我见过的关于堆栈溢出的最坏问题。@Tomalak是的,u,对不起!+1表示勇敢。(以及“自动存储”)@Nelson谢谢你的耐心我只是想知道更多关于“未定义行为”的细节@Zhao:当程序试图执行标准没有定义语义、也不需要诊断的操作时,会产生未定义的行为。例如,取消引用无效指针和除以零。执行此类程序可能会导致产生错误结果、崩溃和无声“工作”,甚至格式化硬盘。像瘟疫一样避免。“未定义的行为”意味着C++没有定义你的代码的结果。它可能崩溃。它可能打印生命、宇宙和一切的重大问题。如果它确实工作,它将只会偶然工作。@ Tomalak谢谢,我得到它。如果我删除了行:CUT+1用于勤奋。- 1“指向垃圾”和“它将打印垃圾”。.这里没有定义的语义;它可能不会打印垃圾,反而会导致时空结构的撕裂。我想它也可能会断裂(?)@phoxis:这是一个可能的结果,是的。@Tomalak Geret'kal:对不起,我错了。我想得不够仔细-P@Insilico:你现在有了勤奋的理由了。:)回答得好。
    cout<<*p<<endl; /* what & why happened to "p" */