2015-07-15 7 views
0
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 **ppT = NULL; 
test(ppT); 
cout << ppT << " " << *ppT << endl; 
cout << ppT << " " << *ppT << endl; 

Если я использую таНос в тесте, он работает. Однако, если я использую новый в тесте, он покажет мне

0049FCC8 0074C378 
0049FCC8 CCCCCCCC 

В чем проблема? Кроме того, я использую Visual Studio 2013 как мой компилятор.

+1

Это выглядит опасно близко к [Три звезды программирования] (http://c2.com/cgi/wiki?ThreeStarProgrammer) – scohe001

ответ

5

Потому что в функции test переменная pT является локальной, и после возвращения функции она выходит из сферы действия. Указатель на него с &pT станет недействительным после того, как вы вернетесь из функции, и попытка его использования приведет к неопределенным поведением.

И это только проблема, другая заключается в том, что вы передаете нулевой указатель на функцию и разыщите ее внутри функции. Когда вы эмулировать проход по ссылке (то, что вы делаете с помощью указателя на указатель), необходимо использовать адрес-оператора на указатель, как

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

Это также вводит в область видимости вопрос, почему вы используете ссылка на указатель указатель на, а не просто ссылку на указатель, как

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