BUG:
今天我写了一个很SB的代码,这个问题其实我早己注意到,在以前写这样的代码的时候,我也留了个心眼,但可能是很长时间不写这些东西导致新问题的产生。
其实这个问题我以前也写过笔记,现在再写一下加深印象。
先附代码:
#ifndef LIST_INSERTREMOVEPRINT_H
#define LIST_INSERTREMOVEPRINT_H
#include<iostream>
struct ListNode{
int val;
struct ListNode *nxt;
};
void addListNode(struct ListNode*list,int value){
struct ListNode *nodeInsert=(struct ListNode*)(malloc(sizeof(struct ListNode)));
nodeInsert->val=value;
nodeInsert->nxt=NULL;
if(list==NULL){
list=nodeInsert;
return ;
}
struct ListNode *iter=list;
while(iter->nxt!=NULL){
iter=iter->nxt;
}
iter->nxt=nodeInsert;
}
#end
其实熟悉的人一看就知道问题出在哪了!!!!!
高亮部分就说明了这个问题。犯这个错误的原因在于对指针的传递不太明白。
void addListNode(struct ListNode*list,int value)
在这个函数中有两个形参,一个是链表节点的指针类型,别一个是int 型啰。
对于这个链表节点指针,我们传入的是什么呢?当然,传入的是一个地址嘛,因为它是指针。
嗯,我们是如何传递这个指针的呢,传值嘛!!!!!!!。你传递地址还是传值啊,只是这个值是”地址“而己嘛。
既然明白这点,那么问题来了,你在函数体内改这
list=nodeInsert
你这个是什么意思啊?,,,把这个nodeInsert地址付值给list ?
也就是你有这么个函数
void test(int a,int value){
int c;
a=c;
}
你这是什么意思? 你还真想通过在函数体内的a=c 来改变实参值吗? 滚你妈的。
iter->nxt=nodeInsert;
这个就更扯蛋了,你还是在改变形参中的值,这个肯定不行啦。
如何解决这个BUG
1, 如果要通过形参改变实参,对于这个地址的传值问题,可以通过 "*" -----解引用运算符。
也就是我们通过这个解引用这个形参,这样找到形参地址对应的空间,在内存里面改变这个实叁的值。
2,传入指针的指针,再用解引用运算符。
反正得解引用才能通过形参改实参!!!!!!