“垃圾兄弟”——垃圾值和野指针

  • c语言中有一对“垃圾兄弟”,虽然各自归属不同,但最终这两兄弟殊途同归——那就是“垃圾值”和“野指针”。这对兄弟可是危险人物,千万不能忽略它们的存在!!
一号人物:“垃圾值”

我们先来说说“垃圾值”的由来,当我们写程序定义了一个局部变量时,系统会将这样的临时变量放入动态数据区的栈区。栈区的内存分配是由系统管理的。如果在定义时该变量未被初始化,或者在以后的程序运行中该变量未被赋值,为了维系这个临时变量的存在,系统就会给这个变量自动赋一个随机的值,但是这个值对我们来说并没有任何价值,于是就称为“垃圾值”。

  • 一般情况下,如果你有变量没有初始化或后续赋值,编译会报错提醒,但有的编译器并不会检查并报错,当我们用到该变量时,往往输出的是“垃圾值”。
    如以下片段:
#Include <stdio.h>

int sum;//打算用于累加求和,但未初始化
int a[10] = { 1 };
int i;//循环因子
for(i=0;i<10;i++)
    sum+=a[i];
printf("sum=%d\n",sum);

运行结果:

sum=-4236810225

可以看到我们没有初始化sum,sum中装的就是垃圾值,自然输出的时候也就是垃圾值。有同学说,“sum+=a[i]”不是赋值了吗?注意:该式子展开应为“sum=sum+a[i]”,一个垃圾值加上一个值不还是垃圾值吗?

二号人物:野指针
  • 野指针的成因主要有两种:

1.当我们定义一个指针变量的时候未对它进行初始化。理解起来和“垃圾值”是一样的,甚至可以说和“垃圾值”师出同门,指针变量同样也是临时变量的一种,同样在动态数据区中的栈区存放,因此定义一个指针变量没对它进行初始化或进行后续的赋值。系统会给赋给它一个随机的地址,这个地址我们不知道它指向何方,乱指一气,也可以理解为这个随机的地址指向一个随机的值,上面我们提到一个随机的值其实就是“垃圾值”,那么这个指向“垃圾值”的指针就可以认为它是个“垃圾指针”,但我个人更喜欢叫它“野指针”。消除该类“野指针”,就是要在定义指针变量的时候,要么将指针设置为NULL,要么让它指向一个合法的内存。

char *p =NULL;   //空指针
char *str = (char*) malloc(100);  //指向一块静态数据区的内存   

2.当我们申请一块堆区空间并将指针p指向它,用完指针p将其free或delete后没有将指针p设置为NULL。这里存在的误区是,很多同学认为free或delete指针p,是将p指向的内存以及指针p本身全部清除释放。但是实际上,free和delete只能将p指向的内存空间释放,而指针p本身还存在,通过第一点我们可以知道,指针变量p作为一个临时变量存放在动态数据区的栈区,只不过此时它指向了一块静态数据区中堆区的空间。free和delete指针p会将它的合理赋值抹除,只留下一个“空壳”,但指针p本身仍然存在!根据第一点此时这个指针p就成了“野指针”。因此我们在free和delete指针p后应该及时的将它设置为NULL,这样能够避免指针p后续使用中的错误。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值