c++ pointer runtime error 指针的奇怪问题 while(head != NULL)

在解决LeetCode上的链表反转问题时,遇到一个runtime error,指出成员访问在需要8字节对齐的'ListNode'类型0x000000000007中不正确。原本的while(head != NULL)循环引发错误。通过对比题解,发现不能直接使用函数参数中的head,而需创建新的变量h = head。错误可能源于未初始化的指针或malloc分配空间后未设置next为NULL。在本地尝试未初始化定义和malloc后未设置next为NULL的情况,都导致了错误或异常行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

在leecode做题遇到一个奇怪的问题:
就是链表反转的题,我本来以为很简单,但是while(head != NULL)这行代码报错
错误信息:Line 14: Char 16: runtime error: member access within misaligned address 0x000000000007 for type ‘ListNode’, which requires 8 byte alignment (ListNodeUtils.cpp)
代码:

    ListNode* reverseList(ListNode* head) {
        ListNode *rehead = NULL;
        ListNode *tmp = NULL;
        while(head != NULL){
            tmp = head;
            head = head->next;
            tmp->next = rehead;
            rehead = tmp;
        }
        return rehead;
    }

然后我看了题解,发现不能直接用函数参数里面的head,而是要重新定义一个变量h=head就能过了。请问这是什么原理?

    ListNode* reverseList(ListNode* head) {
        ListNode *rehead = NULL;
        ListNode *tmp = NULL;
        ListNode *h = head;
        while(h != NULL){
            tmp = h;
            h = h->next;
            tmp->next = rehead;
            rehead = tmp;
        }
        return rehead;
    }
猜想

在网上看到一些说法,都说这个问题是malloc分配空间以后没有对结构体内的next指针初始化造成的。不过我的代码里面没有用到malloc,我想是不是主函数用到了,传入我的solution里面然后就出错了。于是在自己电脑上(devcpp)做了如下尝试:
1.定义不初始化

ListNode *test;
ListNode *revh = reverseList2(test);

test没有进行初始化,程序运行时出错
在这里插入图片描述
2.malloc后不初始化next指针为NULL

ListNode *head = new ListNode(1);
head->next = (ListNode*)malloc(sizeof(ListNode));
ListNode *revh = reverseList2(head);

在这里插入图片描述
不停地打印奇怪的数字。这个应该是内存分配了空间,但空间里面的内容随机,于是next指针不为NULL,而是指向另外的地方,那么链表就没有结尾了,一直打印奇怪的东西。

所以,leecode的这道题出错是因为以上原因吗,感觉不是很严谨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值