课外阅读之4-关于空指针和野指针等_859007261.pdfVIP

课外阅读之4-关于空指针和野指针等_859007261.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
课外阅读之4-关于空指针和野指针等_859007261

课外阅读之 5­­关于空指针 NULL、通用指针和 野指针 黄永峰 首先说一下什么是指针,只要明白了指针的含义,你就明白 null 的含义了。假设 有语 句 int a=10; 那么编译器就在内存中开辟 1个整型单元存放变量 a,我们假设这个整型单元在内存中 的地址是 0x1000;那么内存 0x1000 单元中存放了数据 10,每次我们访问 a 的时候,实际 上都是访问的 0x1000 单元中的 10. 现在定义:int *p; p a; 当编译器遇到语句 int *p 时,它也会在内存中给指针变量 p 分配一个内存单元,假 设这个单元在内存的编址为 0x1003;此时,0x1003 中的值是不确定的, (因为我们没有给 指针赋值),当编译器遇到了 p=a 时,就会在 0x1003 单元中保存 0x1000,请看,这就是 说:(指针变量 p 代表的)内存单元 0x1003 存放了变量 a 的内存地址!用通俗的话说就是 p 指向了变量 a。 p=NULL,就是说:内存单元 0x1003 不存放任何变量的内存地址。 删除一个 new 了的数组。有必要的话。比如非标准的类( new CMyClass),在 Type *p = new Type[N]; delete []p;的最后最好再加一句: p = NULL 1.空指针 空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变 量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。空指针用 0 表示,C 语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。 了提高程序的可读性,标准库定义了一个与 0 等价的符号常量 NULL.程序里可以写 p = 0; 或者 p = NULL; 两种写法都把 p 置为空指针值。相对而言,前一种写法更容易使读程 序的人意识到这里是一个指针赋值。 2.通用指针 我们印象中 C 语言的指针都有类型,实际上也存在一种例外。这里涉及到通用指针, 它可以指向任何类型的变量。通用指针的类型用 (void *)表示,因此也称为 void 指针。 int n=3, *p; void *gp; gp = n; p=(int *)gp1; 3.野指针 野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程 序发生不可预知的错误。 “野指针”不是 NULL 指针, 是指向“垃圾”内存的指针。 人们一般不会错用 NULL 指针, 因为用 if 语句很容易判断。但是“野指针”是很危险的,if 语句对它不起作用。野指针的 成因主要有两种: (1)、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为 NULL 指针,它 的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指 针设置为 NULL,要么让它指向合法的内存。 (2)、指针 p 被 free 或者 delete 之后,没有置为 NULL,让人误以为 p 是个合法的指 针。别看 free 和 delete 的名字恶狠狠的(尤其是 delete),它们只是把指针所指的内存 给释放掉,但并没有把指针本身干掉。通常会用语句 if (p != NULL)进行防错处理。很遗 憾,此时 if语句起不到防错作用,因为即便 p 不是 NULL 指针,它也不指向合法的内存块。 例: char *p = (char *) malloc(100); strcpy(p, “hello”); free(p); // p 所指的内存被释放,但是 p 所指的地址仍然不变 if(p != NULL) // 没有起到防错作用 strcpy(p, “world”); // 出错 另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时 会被释放。 指针是个很强大的工具,可是正因为它太强大,所以要操作它不是件易事。操作不当造 成的野指针,甚至会引起系统死机等比较严重的后果。如果程序定义了一个指针,就必须要 立即让它指向一个我们设定的

文档评论(0)

hhuiws1482 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档