问题
在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的这道题出错是因为以上原因吗,感觉不是很严谨。