如何修复 C++ 中的'Segmentation fault'错误



我正在尝试学习如何使用 gdb 调试器来修复此示例代码。在单步执行调试器时,我可以看到"mylist[i]->val = i;"行抛出了分段错误。

我想我明白什么是分段错误,但我不明白这条线是如何引起的。我需要为 mylist 向量分配内存吗?我该怎么做?我以为向量已经在main((中初始化并准备就绪,但我不太确定。

我尝试对mylist向量中的每个节点使用"new",但这给了我一个编译错误。

node* mylist[i] = new node; //what I tried
mylist[i]->val = i; 
mylist[i]->next = NULL;   
//error message
error: array must be initialized with a brace-enclosed initializer
node* mylist[i] = new node;

我的代码

class node
{
public:
int val;
node* next;
};
void create_LL(vector<node*>& mylist, int node_num)
{
mylist.assign(node_num, NULL);
//create a set of nodes
for (int i = 0; i < node_num; i++)
{
mylist[i]->val = i; //error happens here
mylist[i]->next = NULL;
}
... (relevant section of main() below)
int main(int argc, char ** argv)
{
const int NODE_NUM = 3;
vector<node*> mylist;
create_LL(mylist, NODE_NUM);

显示的实际错误是"分段错误(核心转储(">

当我在错误行之前打印mylist时,它显示

$1 = std::vector of length 3, capacity 3 = {0x0, 0x0, 0x0}

我仍在学习c ++,所以我可能缺少一些非常基本的东西。 我真的很感激任何帮助。谢谢!

对于初学者来说,最好将变量隐藏在class内。如果您不打算这样做,约定是使用struct.在这种情况下,提供一些构造函数也是一种很好的做法,并且可能使用默认值:

class node
{
int val;
node* next;
public:
node(int v= 0, node* n= nullptr) : val(v), next(n) {}
};

请注意使用nullptr而不是NULL。在 c++ 中使用后者是一种不好的做法。

问题是,如果尚未分配仓位,则不能使用std::vector上的仓位。当你这样做mylist[i]->val = i;你就处于不确定行为的领域。

您首先需要push_back()emplace_back()std::vector。因此,当它将您的数据放在vector的末尾(back(时,它size()增长。您也可以使用其他方法,例如reserve().虽然push_back()node*元素推送到您的列表中,但emplace_back()会在没有复制的情况下就地构造它们(与原始指针没有区别,但您可以使用vector<node>而不是vector<node*>这更直接。

// create a set of nodes
void create_LL(vector<node>& mylist, int node_num)
{
for (int i = 0; i < node_num; i++) {
mylist.emplace_back(i, nullptr); // calls node::node(i, nullptr) and inserts it at the end of the vector
}

// create a set of nodes
void create_LL(vector<node*>& mylist, int node_num)
{
for (int i = 0; i < node_num; i++) {
mylist.emplace_back(new node(i, nullptr));
}

相关内容

  • 没有找到相关文章

最新更新