c++ - 在 LinkedList 中插入节点会导致分段错误
问题描述
struct Node
{
int data;
Node * next;
Node (int x)
{
data=x;
next=NULL;
}
};
Node * insertInSorted(Node * head, int data)
{
Node* temp = new Node(data);
if (head == NULL){
return temp;
}
if (data < head->data){
temp->next = head
return temp;
}
Node* curr = head;
while (curr->next->data < data && curr->next != NULL){
curr = curr->next;
}
temp->next = curr->next;
curr->next = temp;
return head;
}
嗨,我最近学习了 C++ 并且一直在练习 LinkedList,这个问题很简单,我要做的就是在正确的位置插入一个元素,同时保持排序顺序。我的问题是为什么我会遇到分段错误。我注意到在 while 循环中,如果我将顺序从while (curr->next->data < data && curr->next != NULL)翻转到while (curr->next != NULL && curr->next-> data < data)不会发生分段错误。有人可以帮我理解这个问题吗?
解决方案
你写它的方式,这个:
curr->next->data < data
在此之前进行评估:
curr->next != NULL
因此,curr->next
当您尝试在 中取消引用它时,可以为 NULL curr->next->data
,因此您访问内存的一些随机部分并且您会遇到分段错误。
正如您所说,更改顺序可以解决问题,这是正确的解决方案。当AND
表达式的第一部分为假时,不会计算第二部分,因此您不会尝试取消引用无效地址,因此您的问题得到解决。
推荐阅读
- discord - 创建消息组件(按钮) discord.js
- html - 如何在 bootstrap.min.css 文件中应用更改
- php - 有没有办法在 sabre api 中检查或创建保留线?
- java - 为什么单击按钮时不显示数组中的随机单词?
- asp.net - 是否有在 Mac 上运行的 ILogger / EventLog 的替代 .NET 日志记录类?
- c# - 将表名作为参数传递给 SqlCommand 的问题
- textarea - 如何捕获在文本区域控件中输入并以角度存储到数据库中的文本和图像 url
- java - 如何为具有多个类和文件夹的摇摆应用程序创建 jar 文件?
- javascript - 在 chrome 应用程序选项卡中使用 axios 请求访问 cookie 的方法
- android - 打开失败:Android(6.0.1)系统应用程序中的EACCES(权限被拒绝)