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

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

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

0 Y- w5 ~8 A0 u
下面来列举一下在学习过程中指针的常见错误。

7 Y* i$ T* k1 F: H0 W- l  Y. Q0 _

6 a% A4 J) P7 f. T% x
1.指针和指针变量
很多初学者没搞明白这两者的区别,以至于很多时候把两者等同了。在C语言中指针是一个概念性的东西,简单而言就是地址。而指针变量是变量类型,属于int,float这类的,是用来存放指针的,也就是地址。但是很多时候我们说指针时是代指指针变量的,这点我们要知道。
( Z% `6 i6 C: x3 R" l6 A& b- z6 M

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

) w1 `7 j' z. i9 y2 ?0 E2 p2 O4 m
3.没分配空间就给指针赋值
这是初学者很容易犯的错误,我们来看一个例子。
  char*p;//定义一个指针来存放字符串
  scanf("%s",p);//会出错

4 {4 L; |7 T. t( P
此时的指针p是没有指向任何有效的空间,看清楚是有效空间,并非是没有指向内存空间,定义的时候p就有值的了,是一个随机值,指向一个不明的内存空间,但是不合法 的,当你去访问的时候就会出错。

6 x) C4 R' x" A- \9 e
正确的写法是
  ~5 V" L4 f1 t6 ]" e
char * p=(char*)malloc(sizeof(char)*size);//size 你所需的内存大小。
$ ^. }+ n$ |% j
scanf("%s",p);//注意这里不能写成"&p",因为p本身就存放了地址,不需再用取地址符了。

# l' H% e9 O, F: v
! O1 S2 p& M2 q4 X7 Q
4.用到二级指针来存放字符串时没有分配到空间
我们常用字符串数组来存放一系列的字符串,但是不能动态分配空间大小,要事先指定,这在很多时候是不行。所以我们要用到指针来存放,这时候就很容易出错了。

9 W! f0 l( f+ u7 m8 L; r  s2 o
错误一:char**p;//定义一个二级指针来存放一系列字符串
    for(i=0;i<size;i++)//size 字符串的个数
    {
      p=(char*)malloc(sizeof(char)*len));//len 字符个数
    }
错误原因:p是一个二级指针用来存放一系列char*变量,但是我没有给p分配内存空间就直接用了。我只是给每一个p分配了空间,但是还需要存放p地址的内存空间。也就是存放每一个字符串地址的内存空间还没有分配给p.

0 B( S& l- t. Z* ?0 m0 q
错误二:
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的时候,就会出错。

1 J3 }% D5 l$ m1 T) b& d1 [$ V% a* F
正确写法:
    char**p;//定义一个二级指针来存放一系列字符串
    p=(char**)malloc(sizeof(char*)*size));//分配size个char*类型的内存空间
    for(i=0;i<size;i++)//size 字符串的个数
    {
      p=(char*)malloc(sizeof(char)*len));//len 字符个数
    }

( Z8 N7 @* ~; R: ~- Q
* M" {/ T- ~+ ~" G0 I
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;
: k$ |7 n6 R. e3 ~$ B! H

$ T9 a( j# y% k! V+ C1 y# P
赞 收藏 评论0 发布时间:2020-3-17 10:28

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版