c++的指针,指针真罪恶

c++中的一个指针问题

class A
{
public:
    A(int num);
    int* p;
};

#include "A.h"
#include<iostream>
using namespace std;
A::A(int num):p(&num) {
    cout << *p << endl;
}

#include "A.h"
#include<iostream>
using namespace std;
int main() {
    A a1(10);

    cout << a1.p <<"    "<< *a1.p<<endl;

    return 0;
}

构造函数中输出p所指的东西,main函数中再输出a1中p所指的东西,两个值不同
10
0000000FC2FAFCC8 -1023738680

p(&num)
这个不行,你去取堆栈上的地址是没有意义的,出了构造函数,这个地址无效了。

我今天看到了一个全网最详细的指针讲解博客,希望对你有帮助,推荐给你:

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    问题的原因在于构造函数中的指针p指向了一个局部变量num,这个局部变量在构造函数执行完毕后就会被销毁,因此在main函数中再次访问指针p时会导致未定义的行为。

    为了修正这个问题,可以将指针p指向动态分配的内存,而不是局部变量。具体步骤如下:

    1. 在类A的构造函数中,使用new操作符动态分配内存来存储整数,并将指针p指向该内存。
    2. 在类A的析构函数中,使用delete操作符释放p指针所指向的内存。

    以下是修正后的代码:

    class A
    {
    public:
        A(int num);
        ~A();
        int* p;
    };
    
    #include "A.h"
    #include <iostream>
    using namespace std;
    
    A::A(int num) {
        p = new int(num);
        cout << *p << endl;
    }
    
    A::~A() {
        delete p;
    }
    
    #include "A.h"
    #include <iostream>
    using namespace std;
    
    int main() {
        A a1(10);
    
        cout << a1.p << "    " << *a1.p << endl;
    
        return 0;
    }
    

    运行修正后的代码,输出结果为:

    10
    000002154F242B20    10
    

    修正后,两次输出的值相同且正确。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^