在编写合并两个排序链表的代码时获取地址错误的运行时负载

Posted

技术标签:

【中文标题】在编写合并两个排序链表的代码时获取地址错误的运行时负载【英文标题】:Getting runtime load of address error while writing code for merging two sorted linked list 【发布时间】:2019-01-23 13:18:43 【问题描述】:

使用虚拟节点添加列表 l1 和列表 l2 的较小节点。最后返回指向虚拟节点旁边的位置以获取实际的合并排序列表,但在返回 dummyNode->next 时获得了空间不足的地址的运行时负载 struct ListNode 类型的对象。

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 
        if (l1 == NULL && l2 != NULL) 
                return l2;
        
        if (l1 != NULL && l2 == NULL) 
                return l1;
        
        struct ListNode *dummyNode = NULL;
        struct ListNode *head = NULL;

        dummyNode = (struct ListNode *)malloc(sizeof(struct ListNode *));
        head = dummyNode;

        while (l1 != NULL && l2 != NULL) 
                if (l1->val <= l2->val) 
                        head->next = l1;
                        l1 = l1->next;
                        head = head->next;
                
                else 
                        head->next = l2;
                        l2 = l2->next;
                        head = head->next;
                
        
        if (l1 != NULL) 
                head->next = l1;
        
        if (l2 != NULL) 
                head->next = l2;
            
        return dummyNode->next;



【问题讨论】:

我认为 malloc 的参数错误 - 它应该是 sizeof(struct ListNode) 而不是 sizeof(struct ListNode *) 请阅读:How to Ask,然后是edit 您的问题,并提供minimal reproducible example 以及触发问题的最小输入。 对第一条评论的补充:而不是dummyNode = (struct ListNode *)malloc(sizeof(struct ListNode));dummyNode = (struct ListNode *)malloc(sizeof(*dummyNode));,这样更不容易出错。你甚至可以放弃演员表:dummyNode = malloc(sizeof(*dummyNode)); 【参考方案1】:

分配的空间不足,因为向 malloc sizeof 传递指向结构 sizeof(struct ListNode *) 的指针。 应该改为为整个结构分配空间 -

dummyNode = (struct ListNode *)malloc(sizeof(struct ListNode));

【讨论】:

以上是关于在编写合并两个排序链表的代码时获取地址错误的运行时负载的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-合并两个排序的链表

两个排序链表的合并(Easy)

合并两个排序的链表

链表的基本操作

jreJava运行环境没有安装或错误

Java错误:创建新的链表节点时无法访问语句[关闭]