为什么我的指针会自动改变?

Zhi*_*ANG 0 c++

struct t{
    int a;
    t(int i){
        a = i;
    }
};

void test(t**& ppT){
    t *pT = (t*)malloc(sizeof(t));
    pT->a = 100;//works

    t *pT = new t(100);//doesn't work

    ppT = &pT;
}
Run Code Online (Sandbox Code Playgroud)

我有一个名为t的结构,以及一个名为test的函数.

在main()中,我有

t **ppT = NULL;
test(ppT);
cout << ppT << " " << *ppT << endl;
cout << ppT << " " << *ppT << endl;
Run Code Online (Sandbox Code Playgroud)

如果我在测试中使用malloc ,它可以工作.但是,如果我在测试中使用new ,它会告诉我

0049FCC8 0074C378
0049FCC8 CCCCCCCC
Run Code Online (Sandbox Code Playgroud)

有什么问题?此外,我使用Visual Studio 2013作为我的编译器.

Som*_*ude 5

因为在test函数中变量pT是本地的,并且一旦函数返回它将超出范围.&pT从函数返回后,指向它的指针将变为无效,并且尝试使用它将导致未定义的行为.

这只是问题的一半,另一个是你将空指针传递给函数,并在函数内取消引用它.当您通过引用模拟传递时(通过使用指向指针的方法),您需要在指针上使用address-of运算符,如

t* pA = 0;
test(&pT);
Run Code Online (Sandbox Code Playgroud)

这也引出了一个问题,为什么你使用对指针指针的引用,而不仅仅是对指针的引用,如

void test(t*& pT);
...
t* pT = nullptr;
test(pT);
Run Code Online (Sandbox Code Playgroud)