2015-02-16 2 views
0

В приведенном ниже коде, почему я не смог получить доступ к test_var из main? Мои предположения состоят в том, что новый выделяет память в кучу, поэтому срок службы до конца основного или до тех пор, пока вы явно не удалите ее. Но когда я пытаюсь получить доступ к test_var, я получаю исключение.Почему переменная struct выходит за пределы области действия

typedef struct test{ 
    int a; 
    string str; 
}test; 

void fun1(test* test_var) 
{ 
    test_var = new test[2]; 
    test_var[0].a=1; 
    test_var[0].str='a'; 
    test_var[1].a = 2; 
    test_var[1].str = 'b'; 
    return; 
} 

int main() 
{ 
    test *test_var = NULL; 
    fun1(test_var); 
    cout<<test_var[0].str; 
    delete test_var;    
    return 1; 
} 

ответ

4

test_var Поскольку является локальным для fun1, и назначение

test_var = new test[2];

имеет силу только в пределах функции.

Вам нужно

void fun1(test** test_var) 
{ 
    *test_var = new test[2]; 
    ... 
} 

и main:

test *test_var = NULL; 
fun1(&test_var); 

P. S. Это не код действительно C++. Использование ручных указателей опасно и их следует избегать. У C++ есть намного более чистые механизмы для выполнения того, что вы пытаетесь сделать. См. std::vector, std::shared_ptr.

3

Это потому, что в функции fun1 test_var является локальной переменной.

void fun1(test* test_var) 

Следовательно, любая модификация, выполняемая в fun1, выполняется по локальной переменной.

Вам нужно сделать:

void fun1(test*& test_var) 
+0

Это будет работать, но с помощью указателя на указатель вместо ссылки на указатель (как говорит мой ответ) является более традиционным способом. –

+0

@ Violet Giraffe In C, может быть. Но вопрос связан с C++. – juanchopanza

+0

Я считаю, что указатель на указатель иногда сбивает с толку. –