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

时间:2015-07-15 17:50:35

标签: 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;
}

我有一个名为 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作为我的编译器。

1 个答案:

答案 0 :(得分:5)

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

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

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

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

void test(t*& pT);
...
t* pT = nullptr;
test(pT);