为什么未初始化的指针会指向一个不确定地址

分配一个变量是编译器还是系统的工作?

分配一个新变量的时候,编译器/系统为什么不会把该内存区域的数据清零
为什么未初始化的指针/变量会指向一个随机值(不确定值),而不是NULL
为什么delete、free不会将使用的内存清零,然后再释放、把指针置NULL
内存中残留的数据还有意义吗?这点会被黑客利用吗?
为了效率,所以编译器/系统不做这些不必要的操作?

作者:明月楼高
链接:https://www.zhihu.com/question/40197087/answer/85434085

1、全局变量中的指针默认指向0,栈中的指针默认指向0xcccccccc,堆中的指针默认指向0xcdcdcdcd。对于在windows下的c语言写出的控制台程序和窗体程序,全局变量和局部static变量都是放在全局区域,这部分区域默认是0,至于为什么是0,我不知道。
2、栈中的指针,也就是在函数函数体内(包括main和其他的入口函数)声明的指针,默认值是0xcccccccc,在看汇编的时候可以发现,在函数调用过程中,参数入栈,调整栈帧后,编译器会生成一段额外的代码用来初始化调用栈,也就是把这些地方的数据全部改为0xcccccccc(0xcc的汇编语言是int3,中止的意思,相当于插入断点)。
3、堆区的数据默认是0xcd(堆区可以分配的地方默认是0xcd,关于堆我了解的不多,有误请指出),但是在堆中的指针我还没有见过,int*p=new int这种方法定义的指针p在栈中,它ta指向堆中的一个地方。
4、delete和free只是把堆中的这块区域标记为空闲。标记空闲只需要把该区域加入到堆的空闲链表中就可以了。如果要置0,效率会低。
5、内存中残留数据一般出现在堆中,这些数据应该很难被黑了利用吧,第一,这些数据在庞大的堆中,由于已经泄露,所以找到他们很难,其次,就算找到了这些数据的位置,但你不知道这些16进制数代表什么?字符?数字?还是其他。不过不排除一些黑客真的去找到了这些数据然后进行分析。比如你把你的银行卡密码存了起来然后只是简单的把ta delete掉, int* key=new int,*key=123456,delete key,这样的话123456还在堆中,还是可以找到的(就像大海捞针,只是不太容易
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值