gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:44:31 28 4
gpt4 key购买 nike

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

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

我曾尝试对 mylist vector 中的每个节点使用“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);

实际显示的错误是“Segmentation fault (core dumped)”

当我在错误行之前打印 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 .所以它是size()随着它将您的数据放在 back 的末尾(vector)而增长.您还可以使用其他方法,例如 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));
}

关于c++ - 如何修复 C++ 中的 'Segmentation fault' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57719972/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com