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

Why do my pointer change itself automatically?

本文关键字:改变 我的 指针 为什么      更新时间:2023-10-16
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;
}
我有一个名为t的结构体和一个名为test的函数。 在main()中,我有
t **ppT = NULL;
test(ppT);
cout << ppT << " " << *ppT << endl;
cout << ppT << " " << *ppT << endl;
如果我在test中使用malloc,它可以工作。但是,如果我在test中使用new,它会显示
0049FCC8 0074C378
0049FCC8 CCCCCCCC

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

因为在test函数中,变量pT是局部的,一旦函数返回,它将超出作用域。一旦你从函数返回,你用&pT得到的指向它的指针将变得无效,并且试图使用它将导致未定义行为

这只是问题的一半,另一个是你传递一个空指针给函数,并在函数内解引用它。当您模拟引用传递(通过使用指针指向指针所做的事情)时,您需要在指针上使用地址操作符,如

t* pA = 0;
test(&pT);

这也引出了一个问题:为什么要使用指针对指针的引用,而不是像

那样简单地使用指针对指针的引用?
void test(t*& pT);
...
t* pT = nullptr;
test(pT);