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

431

被折叠的 条评论
为什么被折叠?



