为什么struct变量超出范围

时间:2015-02-16 07:40:41

标签: c++ pointers

在下面的代码中,为什么我无法从main访问test_var?我的假设是new在堆中分配内存,所以生命周期一直到main的结尾,或直到你明确删除它。但是当我尝试访问test_var时,我得到了异常。

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;
}

2 个答案:

答案 0 :(得分:4)

因为test_varfun1的本地和分配

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::vectorstd::shared_ptr

答案 1 :(得分:3)

因为在函数fun1中,test_var是一个局部变量。

void fun1(test* test_var)

因此,在fun1中完成的任何修改都是在局部变量上完成的。

你需要这样做:

void fun1(test*& test_var)