传入参数为NULL的悲剧


     (一) 这个错误我调试了很久,现在些日志以示警戒。我写的是一个普通的链表。但是出现了很多让我苦笑不得的错误。最后的原因归结为:我传入了NULL指针给InitList()函数。实在不应该呀。昨天看书的时候,看到给printf()传入NULL 指针的悲剧,没有想到我就犯了这个错误。废话少说,现在上实例:

原来的错误:

       int main(int argc, char** argv)
      {
         LinkList L = NULL;
         InitList(L); ...

      }


   应将其改为:InitList(&L);因为L是NULL,不能作为参数传进去。会找不到地址。

  以后要绝对的注意不要传NULL指针给函数。

   (二)还有一个注意的是:当函数里面要改变指针的值时,传给函数的是指针的地址,而不是指针。那边接到的只是指针的一份拷贝。如果你传入一个指针,而不是指针的地址。那么,你在函数里即使改变了指针的地址,那也是改变了指针拷贝的地址,局部变量,函数结束之后就释放了。所以还是没有改变指针的内容。

    改正的方法是:传入指针的地址,用二重指针接收。

  如:void ListInsert(LinkList L,int i,int e){
int j = 0;
LinkList p = L->next,q;
if(i <= 0 ||i > ListLength(L)+1)
exit(1);
while(p&&j<i-1){
j++;
p = p->next;
}
q = (LinkList)malloc(sizeof(struct LNode));
q->data = e;
q->next = p ->next;
p->next = q;
if(p == L)
L = q;                                                  
}

void ListInsert(LinkList *L,int i,int e){
int j = 0;
LinkList p = (*L)->next,q;
if(i <= 0 ||i > ListLength(*L)+1)
exit(1);
while(p&&j<i-1){
j++;
p = p->next;
}
q = (LinkList)malloc(sizeof(struct LNode));
q->data = e;
q->next = p ->next;
p->next = q;
if(p == *L)
*L = q;
}

 区别很明显:就是要改变指针L里面的内容,所以需要传入指针的地址。第一个会出现错误。第二个不会。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值