回 帖 发 新 帖 刷新版面

主题:关于指针的问题 为什么两次输出的值不同

#include <iostream>
using namespace std;
int * getPtr(){
    int number = 3;
    return &number;
}
int main(){
    int * ptr = getPtr();
    int number;

    number = *ptr;
    cout <<"number = "<<number<<endl;

    number = *ptr;
    cout <<"number = "<<number<<endl;
    return 0;
}

为什么两次number输出的值不同?怎么改?

回复列表 (共3个回复)

沙发


问题似乎与int * ptr = getPtr();这句有关系 , 去掉这个函数调用就没事了 ;
而且假如在主函数内部把这两句
number = *ptr;
cout <<"number = "<<number<<endl;多写几遍,除了第一遍等于3之外,后面的几遍输出为同一个值;再调试一遍,除了第一个输出为3之外,后面几个又是另外一个数;
继续再调试一遍,它又跟第一遍的结果一样了 !
去掉getPtr();后,在主函数内部实现这个的时候,就没有这个情况!
        哎,学识浅薄,等待大侠中...

板凳

我稍微修改了程序,
#include <iostream>
using namespace std;
int * getPtr()
{
    int number = 3;
    return &number;
}
int main(){
    int * ptr = getPtr();
    int number;

    number = *ptr;
    cout <<"number = "<<number<<endl;

    number = *ptr;
    cout <<"number = "<<number<<endl;

    ptr = getPtr();
    number = *ptr;
    cout <<"number = "<<number<<endl;

    number = *ptr;
    cout <<"number = "<<number<<endl;
    return 0;
}
发现临时变量在函数调用后第一次使用是保留的,第二次使用就清掉了。可能是编译器的作用。不太确定。

3 楼


因为 当第一次调用完getPtr函数之后,指针ptr指向整数3,然而整数3是函数的变量,它在栈中产生,一旦函数结束之后,系统自动消除,所以第二次ptr所指向的整数已经不是3了,是一个编译器规定的值 

修改1
#include <iostream>
using namespace std;
int * getPtr(){
    static int number = 3;
    return &number;
}
int main(){
    int * ptr = getPtr();
    int number;

    number = *ptr;
    cout <<"number = "<<number<<endl;

    number = *ptr;
    cout <<"number = "<<number<<endl;
    return 0;
}
加一个static变成静态变量,使函数结束时,值不消失


我来回复

您尚未登录,请登录后再回复。点此登录或注册