来源:21ic电子网java
指针用的好犹如神助,用很差会让你叫苦连连,但大多数人是用很差指针的,因此后来的不少语言都把指针封装,屏蔽。好比JAVA,java是没有指针的,可是不少地方都用到指针,不过不对用户开放,语言的自身机制帮用户处理指针的分配释放,为的就是方便用户使用,减小错误。不过咱们不能因噎废食,指针虽难,但学好了会大大提高你的编程能力。编程
下面来列举一下在学习过程当中指针的常见错误。数组
1.指针和指针变量微信
不少初学者没搞明白这二者的区别,以致于不少时候把二者等同了。在C语言中指针是一个概念性的东西,简单而言就是地址。而指针变量是变量类型,属于int,float这类的,是用来存放指针的,也就是地址。可是不少时候咱们说指针时是代指指针变量的,这点咱们要知道。app
2.指针变量的地址和指针变量存放的地址编辑器
凡是变量都要有内存来存放,指针变量也不例外,它也有一个地址,可是指针变量自己又是存放地址的,因此不少人会在这个地方搞不清楚,分不清何时是指针变量的地址,何时是指针变量存放的地址,尤为是在有二级指针或数组的时候。学习
3.没分配空间就给指针赋值flex
这是初学者很容易犯的错误,咱们来看一个例子。ui
char*p;//定义一个指针来存放字符串url
scanf("%s",p);//会出错
此时的指针p是没有指向任何有效的空间,看清楚是有效空间,并不是是没有指向内存空间,定义的时候p就有值的了,是一个随机值,指向一个不明的内存空间,可是不合法 的,当你去访问的时候就会出错。
正确的写法是
char * p=(char*)malloc(sizeof(char)*size);//size 你所需的内存大小。
scanf("%s",p);//注意这里不能写成"&p",由于p自己就存放了地址,不需再用取地址符了。
4.用到二级指针来存放字符串时没有分配到空间
咱们经常使用字符串数组来存放一系列的字符串,可是不能动态分配空间大小,要事先指定,这在不少时候是不行。因此咱们要用到指针来存放,这时候就很容易出错了。
错误一:char**p;//定义一个二级指针来存放一系列字符串
for(i=0;i<size;i++)//size 字符串的个数
{
p[i]=(char*)malloc(sizeof(char)*len));//len 字符个数
}
错误缘由:p是一个二级指针用来存放一系列char*变量,可是我没有给p分配内存空间就直接用了。我只是给每个p[i]分配了空间,可是还须要存放p[i]地址的内存空间。也就是存放每个字符串地址的内存空间尚未分配给p.
错误二:
char**p;//定义一个二级指针来存放一系列字符串
p=(char**)malloc(sizeof(char*));
for(i=0;i<size;i++)//size 字符串的个数
{
p[i]=(char*)malloc(sizeof(char)*len));//len 字符个数
}
错误缘由:这是很网上多人的写法,也是很常见的一种错误,这里虽然给p分配了空间可是仅仅是分配了一个char*类型的空间,当size超过1的时候,就会出错。
正确写法:
char**p;//定义一个二级指针来存放一系列字符串
p=(char**)malloc(sizeof(char*)*size));//分配size个char*类型的内存空间
for(i=0;i<size;i++)//size 字符串的个数
{
p[i]=(char*)malloc(sizeof(char)*len));//len 字符个数
}
5.释放空间
C语言中用free来释放空间,通常用法是:
free(p);//这里释放的是p指向的空间,存放p的内存空间没有被释放。
p=NULL;//建议加上这句
分配空间:
char**p;//定义一个二级指针来存放一系列字符串
p=(char**)malloc(sizeof(char*)*size));//分配size个char*类型的内存空间
for(i=0;i<size;i++)//size 字符串的个数
{
p[i]=(char*)malloc(sizeof(char)*len));//len 字符个数
}
释放空间正确写法:
for(i=0;i<size;i++)
free(p[i]);
free(p);
p=NULL;
若是以为文章不错,帮忙点转发、在看,您的支持也是咱们继续更新的动力。
公众号聊天界面,回复关键词:加群,可加入小熊派开源社区交流群,期待您的到来~

往期回顾
本文分享自微信公众号 - 小熊派开源社区(BearPi-Club)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。