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