你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在学习过程中C语言指针的常见错误

[复制链接]
gaosmile 发布时间:2020-3-17 10:28
指针用的好犹如神助,用不好会让你叫苦连连,但大多数人是用不好指针的,所以后来的很多语言都把指针封装,屏蔽。比如JAVA,java是没有指针的,但是很多地方都用到指针,不过不对用户开放,语言的自身机制帮用户处理指针的分配释放,为的就是方便用户使用,减少错误。不过我们不能因噎废食,指针虽难,但学好了会大大提升你的编程能力。

下面来列举一下在学习过程中指针的常见错误。


1.指针和指针变量
很多初学者没搞明白这两者的区别,以至于很多时候把两者等同了。在C语言中指针是一个概念性的东西,简单而言就是地址。而指针变量是变量类型,属于int,float这类的,是用来存放指针的,也就是地址。但是很多时候我们说指针时是代指指针变量的,这点我们要知道。


2.指针变量的地址和指针变量存放的地址
凡是变量都要有内存来存放,指针变量也不例外,它也有一个地址,但是指针变量本身又是存放地址的,所以很多人会在这个地方搞不清楚,分不清什么时候是指针变量的地址,什么时候是指针变量存放的地址,尤其是在有二级指针或数组的时候。

3.没分配空间就给指针赋值
这是初学者很容易犯的错误,我们来看一个例子。
  char*p;//定义一个指针来存放字符串
  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=(char*)malloc(sizeof(char)*len));//len 字符个数
    }
错误原因:p是一个二级指针用来存放一系列char*变量,但是我没有给p分配内存空间就直接用了。我只是给每一个p分配了空间,但是还需要存放p地址的内存空间。也就是存放每一个字符串地址的内存空间还没有分配给p.

错误二:
char**p;//定义一个二级指针来存放一系列字符串
    p=(char**)malloc(sizeof(char*));
    for(i=0;i<size;i++)//size 字符串的个数
    {
      p=(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=(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=(char*)malloc(sizeof(char)*len));//len 字符个数
    }
释放空间正确写法:
    for(i=0;i<size;i++)
      free(p);
    free(p);
    p=NULL;


收藏 评论0 发布时间:2020-3-17 10:28

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版