【问题标题】:Removing cout causes segmentation fault删除 cout 会导致分段错误
【发布时间】:2020-03-15 19:29:19
【问题描述】:

这是我的代码:

template <typename T>
struct Node
{
   T info;       
   Node<T>* next; 
};


template<typename T>
struct List
{
   Node<T>* n;
   int curr;
};

List<T> listCreate()
{
   List<T> lst;
   lst.curr = 0;
   cout << lst.n->info;
   lst.n->info = 0;
   lst.n->next = NULL;
   return lst;
}

如果我删除 cout &lt;&lt; lst.n-&gt;info; 会导致分段错误。我想要实现的是简单地创建一个 List 并具有下一个值:

lst:

  • curr = 0
  • n:
    • 信息 = 0
    • 下一个 = NULL

但我找不到实现此目的的方法,我尝试在谷歌上搜索并阅读有关指针和结构的信息,但我找不到问题所在。这可能是一个简单的问题,但我找不到。

提前致谢。

【问题讨论】:

  • 你在哪里初始化lst.n
  • lst.n为空或未初始化,其值是随机的。
  • 那是真的我忘了初始化lst.n,我太笨了。谢谢!毕竟这是一个简单的错误哈哈哈。

标签: c++ eclipse


【解决方案1】:

您忘记初始化lst.n。访问未初始化的内存或 nullptr 是未定义的行为。

你可以这样做:

List<T> listCreate()
{
   List<T> lst;
   lst.curr = 0;
   // new code
   lst.n = new Node<T>();
   lst.n->next = nullptr;
   // end
   cout << lst.n->info;
   lst.n->info = 0;
   lst.n->next = nullptr;
   return lst;
}

请考虑避免使用NULL。你应该在c++ 中使用nullptr

【讨论】:

  • 谢谢。我使用 NULL 是因为我正在学习算法和数据结构的基础课程,我们的教授告诉我们现在使用 NULL。现在我明白了为什么编译器会抱怨 NULL 并说“从 NULL 转换为非指针类型”。谢谢,祝你有美好的一天。
【解决方案2】:

请记住,取消引用 null 或未初始化的指针是未定义的行为。您正在尝试取消引用代码中未初始化的指针 lst.n-&gt;info

【讨论】:

  • 这是一个未初始化的指针,不一定是空指针。
  • 没问题 - 您可以点击上方的edit 按钮并为未来的读者更正答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 2017-06-11
  • 2021-11-14
  • 1970-01-01
  • 2014-08-15
相关资源
最近更新 更多