当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

使用指针常出现的错误

发表于: 2014-04-22   作者:麦田的设计者   来源:转载   浏览:
摘要:                                                         &nb

                                                     

              使用c语言指针常出现的错误

1、内存泄露,当使用指针指向堆内存时,使用完后要free掉。否则,随着没有指针指向堆内存的逐渐累积,会造成系统崩溃。

2、使用空指针,首先要说明一下什么是空指针(和零指针不同,零指针表示指针变量的值为0,即地址为0)。如果p是一个指针变量则p=0;p=0L;p='0\';p=3-3;p=0*12,p=NULL(NULL在这里是宏定义)或者在c语言里有p=(void×)0,则称p为一个空指针。在编程里我们经常看见if(p&&其它表达式)的形式就是为了保证指针变量不为空,因为任何变量或者函数的地址都不可能为空。

3、使用了野指针,野指针不是指向NULL的指针,而是指向“垃圾”内存的指针。

 无意使用野指针的情况

《1》定义了一个指针变量却没有初始化(未被初始化是指针会随便乱指),指针变量被创建后要指向和法的内存p=NULL;p=(int ×)malloc(sizeof(int))p=“字符串”;

 《2》在使用了free关键字释放掉了堆内存后而没有对指向堆内存的指针变量p另外赋值,这时p会指向一个不可预知的地方。

例如

char × p;

p=(char *)malloc(100);

p="testing";

free(p);

strcry(p,“OK”);/*不可以,p指向未知*/

4\使用局部变量的地址作为返回值。

程序1#include<stdio.h>

char * strtest(char *p)

{

p[10]="working";

return p;

}

void main()

{

char *p,*q;

q=strtest(p);

puts(q);

 

}

运行出错

程序2#include<stdio.h>

char * strtest(char *p)

{

p="working";

return p;

}

void main()

{

char *p,*q;

q=strtest(p);

puts(q);

 

}

运行成功,输出working;

原因:程序一使用了局部变量作为返回值。

以上就是本人今天看书的心得

 

 

使用指针常出现的错误

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
修改mvn archetype:create 改成mvn archetype:generate 刚开始学习用Maven, 装好了以后生成一个新的
使用dx的各种悲剧错误,一直一直搞啊搞,搞了三天之后才把这么个小错误搞定 做程序员不易浮躁啊,还
刚接触到指针时,关于指向变量的常指针和指向常变量的指针容易混淆,所以整理下,希望能够帮助自己
学习网络,最常见的就是路由器的故障与排除,这里与大家一起分享。转载出处 http://g.51cto.com/yib
关于苹果的证书,我一听到就头大,一直就头大,从未被改变。今天头不在,老总让打包,哎呀,我那个
当我们安装好Genymotion后,把Android运用部署到上面调试时,console控制台会报错:Installation er
错误如下: 阅读他的头文件,少了两个配置的步骤,解决办法如下图所示 一 搜索header search paths
一、System.Security.Cryptography.CryptographicException: 找不到对象 at System.Security.Crypto
当我们安装好Genymotion后,把Android运用部署到上面调试时,console 控制台会报错:Installation e
realloc函数用来为ptr重新分配大小为size的一块内存,看似很简单,在使用过程中却会发生各种错误。
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号