使用指针,c ++初始化int和字符串初始化

时间:2013-10-29 15:33:34

标签: c++ pointers

我最近在试验链接列表时遇到了一个问题。当我使用函数来链接在其数据字段中具有字符串的新节点时,它不起作用。我的意思是,当函数(linkin()见下文)返回时,字符串(函数的本地)被销毁,因此字符串字段似乎未初始化。

但是,当我使用int执行完全相同的操作时,它似乎工作得很好。我使用的代码如下(它的int版本,但是使val成为字符串而不是int来查看其他版本)。有人可以向我解释发生了什么吗?

谢谢!

struct testlist {
    int val;
    testlist *next;
};
void linkin ( testlist *a );

int main() {

    testlist test;

    linkin(&test);
    cout << test.next->val <<endl;
}


void linkin ( testlist *a )
{
  testlist b;
  b.val=1;
  a->next = &b;
  cout << a->next->val <<endl;
}

2 个答案:

答案 0 :(得分:4)

testlist b;
a->next = &b;

a->next指向一个本地临时对象,它将在从函数返回后立即被销毁。在从函数中取消引用后,它会调用未定义的行为

这是未定义的行为,有时它有效,有时不行。


同样在C ++中有一个链表:std::list。另一方面,您可以使用std::unique_ptr等智能指针而不是裸指针。我已经根据你的容器编写了一个智能指针:

struct List
{
    int val;
    unique_ptr<List> next;
};

void linkin (List &a)
{
    unique_ptr<List> b(new List);
    b->val = 1;
    a.next = move(b); // After move you can't use b anymore
    cout << a.next->val << endl;
}

int main()
{
    List test;
    linkin(test);
    cout << test.next->val <<endl;
}

答案 1 :(得分:0)

直接离开,在linkin()我可以看到你在a中将一个指针存放到一个将超出范围的对象 - 即:被销毁。

有可能出现来处理int而不是像std :: string这样的复杂类型。尽管出现这是破解的代码 - 尝试重写linkin()

void linkin ( testlist& a )
{
   testlist* b = new testlist;
   b->val=1;
   a->next = b;
   cout << a->next->val <<endl;
}