指针错误疑问

T_A_Chad 2018-09-13 10:48:41
Qt调试时到函数调用那一步会出现The inferior stopped because it received a signal from the operating system.
请教大神,源程序如下
int main()
{
ListNode *head,*listnode1,*listnode2;
head = (ListNode*)malloc(sizeof(ListNode));
// head = new ListNode;
// listnode1 = (ListNode*)malloc(sizeof(ListNode));
listnode2 = (ListNode*)malloc(sizeof(ListNode));
for(int i = 0;i<3;i++)
{
if(i == 0)
{
listnode1 = head->next;
listnode1 = (ListNode*)malloc(sizeof(ListNode));
}
listnode1->val = i;
listnode1->next = (ListNode*)malloc(sizeof(ListNode));
listnode1 = listnode1->next;

}
listnode1->next = NULL;

Solution s ;
listnode2 = s.deleteDuplicates(head);


return 0;
}
...全文
361 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
noob_woo 2018-09-17
  • 打赏
  • 举报
回复
引用 5 楼 fengrongtiedi 的回复:
我的 疑问是 为什么还要有加一句:head->next = listnode1;
listnode1 = head->next;
listnode1 = (ListNode*)malloc(sizeof(ListNode));这两句不足以为head->next分配有效的内存空间吗

head->next并未初始化,指针内容未知,直接listnode1 = head->next肯定不行
T_A_Chad 2018-09-17
  • 打赏
  • 举报
回复
我的 疑问是 为什么还要有加一句:head->next = listnode1;
listnode1 = head->next;
listnode1 = (ListNode*)malloc(sizeof(ListNode));这两句不足以为head->next分配有效的内存空间吗
zangfong 2018-09-13
  • 打赏
  • 举报
回复
你说的是到函数调用的那一步就出现这个错误,
listnode2 = s.deleteDuplicates(head);
如果是执行到这句出现问题的话,我觉得可能是你的solution类的写的有问题,碰到野指针啥的。
刚刚搜了下,https://bbs.csdn.net/topics/390804361有个关于solution类的讨论,不过这个solution类是用来删除相邻相同值节点的,应该跟你的不同,不过至少可以供你参考一下。

我把这个套进去,稍微加了几句代码,运行没有出错,以下测试代码供参考,head->val的值分别取0,1,就可以看到listnode2 = s.deleteDuplicates(head);的执行效果了
#include<cstdio>
#include<cstdlib>
using namespace std;

typedef struct Node{
int val;
Node *next;
}ListNode;


class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (head == NULL)
return head;

ListNode* cur = head;
ListNode* pre = head->next;
ListNode* del = NULL;
while(pre != NULL)
{
if (cur->val == pre->val)
{
del = pre;
pre = pre->next; // <span style="color: #FF0000;">这句是有作用的,就是把pre指向next节点</span>
cur->next = pre; //
delete del; // <span style="color: #FF0000;">如果合并之后,这一句就是delete pre;另外建议你释放内存的时候这么写之后再加一句del = NULL;这样可以防止野指针的出现。</span>
}
else
{
cur = cur->next;
pre = pre->next;
}
}
return head;
}
};



int main()
{
ListNode *head,*listnode1,*listnode2;
head = (ListNode*)malloc(sizeof(ListNode));
// head = new ListNode;
// listnode1 = (ListNode*)malloc(sizeof(ListNode));
listnode2 = (ListNode*)malloc(sizeof(ListNode));
head->val = 0;
head->next = NULL;
for(int i = 0;i<3;i++)
{
if(i == 0)
{
listnode1 = head->next;
listnode1 = (ListNode*)malloc(sizeof(ListNode));
head->next = listnode1;
}
listnode1->val = i;
listnode1->next = (ListNode*)malloc(sizeof(ListNode));
listnode1 = listnode1->next;

}
listnode1->next = NULL;


Solution s ;
listnode2 = s.deleteDuplicates(head);

listnode2 = head;
while(listnode2->next != NULL)
{
printf("%d\n",listnode2->val);
listnode2 = listnode2->next;
}

return 0;
}


T_A_Chad 2018-09-13
  • 打赏
  • 举报
回复
能不能详细解释下,谢谢
NexTor 2018-09-13
  • 打赏
  • 举报
回复
少一个head->next = listnode1;
int main()
{
ListNode *head,*listnode1,*listnode2;
head = (ListNode*)malloc(sizeof(ListNode));
// head = new ListNode;
// listnode1 = (ListNode*)malloc(sizeof(ListNode));
listnode2 = (ListNode*)malloc(sizeof(ListNode));
for(int i = 0;i<3;i++)
{
if(i == 0)
{
listnode1 = head->next;
listnode1 = (ListNode*)malloc(sizeof(ListNode));
head->next = listnode1;
}
listnode1->val = i;
listnode1->next = (ListNode*)malloc(sizeof(ListNode));
listnode1 = listnode1->next;

}
listnode1->next = NULL;

Solution s ;
listnode2 = s.deleteDuplicates(head);

return 0;
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧