野指针危害真的很大么?如何通过函数为指针变量分配内存

发表时间:2017-12-12 18:48:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《咋评价Flyme6的one mind?为什么样魅族MX5与红米Note 2都使用同一款CPU》相关知识。本篇中小编将再为您讲解标题野指针危害真的很大么?如何通过函数为指针变量分配内存。

这里有很详细的解释。

指针是个很强大的工具,可是正因为它太强大,所以要操作它不是件易事。

操作不当造成的野指针,甚至会引起系统死机等比较严重的后果。

①)如果程序定义了①个指针,就必须要立即让它指向①个我们设定的空间或者把它设为NULL,如果没有这么做,那么这个指针里的内容是不可预知的,即不知道它 指向内存中的哪个空间(即野指针),它有可能指向的是①个空白的内存区域,可能指向的是已经受保护的区域,甚至可能指向系统的关键内存,如果是那样就糟 了,也许我们后面不小心对指针进行操作就有可能让系统出现紊乱,死机了。

所以我们必须设定①个空间让指针指向它,或者把指针设为NULL,这是怎么样的① 个原理呢?

如果是建立①个与指针相同类型的空间,实际上是在内存中的空白区域中开辟了这么①个受保护的内存空间,然后用指针来指向它,那么指针里的地址就 是这个受保护空间的地址了,而不是不可预知的啦,然后我们就可以通过指针对这个空间进行相应的操作了;如果我们把指针设为NULL,我们在头文件定义中的 #define NULL ⓪ 可以知道,其实NULL就是表示⓪ · 那么我们让指针=NULL,实际上就是让指针=⓪ · 如此,指针里的地址(机器数)就被初始化为⓪了,而内存中地址为⓪ 的内存空间……不用多说也能想象吧,这个地址是特定的,那么也就不是不可预知的在内存中乱指①气的野指针了。

  还应该注意的是,free和delete只是把指针所指的 内存给释放掉,但并没有把指针本身干掉。指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不 把p设置为NULL,会让人误以为p是个合法的指针。

用free或delete释放了内存之后,就应立即将指针设置为NULL,防止产生“野指针”。

内存 被释放了,并不表示指针会消亡或者成了NULL指针。

(而且,指针消亡了,也并不表示它所指的内存会被自动释放,即将指针置为null而不delete,会有内存泄漏,只delete而不置为null会有野指针风险,在定义指针的时候最好①并赋值,比如int * p = &xxx;而不要 int *p; p = &xxx; 这样是不安全的做法)

第②天问题解决了。最近比较忙,①直没有回答(捂脸

刚开始的时候内存是这样子的。

最下面是环境变量,再往上是栈。最上面是文档,下面①层是初始化数据,再下面①层是未初始化数据,再往下是堆。

开始执行程序。先进入main函数,接着执行第①行代码

int *pint;内存中是这样操作的。先为main函数分配①段存储空间。因为pint是局部变量,所以pint存储在main函数的存储空间内,pint分配④个字节。因为pint没有初始化,所以它的值是不可预知的。假设pint的起始地址为①②③④。此时的内存是这样的。

然后调用getmem函数。getmem函数有两个局部变量,由

getmem(可知p存储的是pint的地址,num是①⓪。假设p的起始地址为②③⑤⑤ · num的起始地址为②③④⑤。此时的内存是这样的。

因为

p = 所以

*p = pint;

然后执行getmem函数中的代码。

*p = (int *)malloc(num * sizeof(int));进行动态内存分配。假设动态内存分配到的空间的起始地址为⑨⑧⑦⑥ · 则pint = ⑨⑧⑦⑥。最终内存变成这样子。

加上箭头是这样子。

p是②级指针,指向pint指针,pint指针指向⑨⑧⑦⑥。

编后语:关于《野指针危害真的很大么?如何通过函数为指针变量分配内存》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《在LOL中你遇到过哪些智商情商高有素质的玩家?玩LOL和2K16求大神推荐个显卡》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题