指针用的好犹如神助,用不好会让你叫苦连连,但大多数人是用不好指针的,所以后来的很多语言都把指针封装,屏蔽。比如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[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;

C语言指针一些常见的错误用法的更多相关文章

  1. MySQL · 性能优化 · MySQL常见SQL错误用法(转自-阿里云云栖社区)

    作者:阿里云云栖社区链接:https://zhuanlan.zhihu.com/p/26043916来源:知乎著作权归作者所有,转载请联系作者获得授权. 前言 MySQL在2016年仍然保持强劲的数据 ...

  2. MySQL · 性能优化 · MySQL常见SQL错误用法

    1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般DBA想到的办法是在type, name, create_time字段上加组合索引.这样 ...

  3. 8种常见SQL错误用法,你中招了吗?

    作者:db匠 来源:https://yq.aliyun.com/articles/72501 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句, ...

  4. 8 种常见 SQL 错误用法

    点击上方"开源Linux",选择"设为星标"回复"学习"获取独家整理的学习资料! 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常 ...

  5. 【MySQL性能优化】MySQL常见SQL错误用法

    https://yq.aliyun.com/articles/72501?utm_content=m_14899

  6. MySQL - 性能优化 & MySQL常见SQL错误用法(转载)

    1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如: , ; 一般DBA想到的办法是在type, name, create_time字段上加组合索引.这样条件排序 ...

  7. 8种常见的SQL错误用法

    常见SQL错误用法 1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般DBA想到的办法是在type, name, create_time字 ...

  8. 关于C语言指针的一些新认识(1)

    Technorati 标签: 指针,数组,汇编,C语言 前言 指针是C语言的精华,但我对它一直有种敬而远之的感觉,因为一个不小心就可能让你的程序陷入莫名其妙的麻烦之中.所以,在处理字符串时,我总是能用 ...

  9. 初学Python常见异常错误,总有一处你会遇到!

    初学Python常见错误 忘记写冒号 误用= 错误 缩紧 变量没有定义 中英文输入法导致的错误 不同数据类型的拼接 索引位置问题 使用字典中不存在的键 忘了括号 漏传参数 缺失依赖库 使用了pytho ...

  10. 深入理解C语言 - 指针使用的常见错误

    在C语言中,指针的重要性不言而喻,但在很多时候指针又被认为是一把双刃剑.一方面,指针是构建数据结构和操作内存的精确而高效的工具.另一方面,它们又很容易误用,从而产生不可预知的软件bug.下面总结一下指 ...

随机推荐

  1. Windows添加软件开机自启动

    两种方式 1.添加快捷方式到开始菜单 打开我的电脑找到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 文件夹, 如果难找的话可 ...

  2. P10789 [NOI2024] 登山

    思路: 我们可以对于每个 \(i\) 找到它能跳到的最远的点和最近的点,倍增求一下 \(k\) 级祖先即可,令 \([l_i,r_i]\) 新表示 \(i\) 能跳到其祖先中深度在 \([l_i,r_ ...

  3. 阿里云 SLS 模糊查询日志

    查询包含test前缀的词 1. 访问 https://sls.console.aliyun.com/lognext/profile 2. 在Project列表中找到对应的sls日志Project 3. ...

  4. Redis 入门 - 简介

    Redis是Remote Dictionary Server的缩写,可以翻译成远程字典服务.Redis是用C语言编写的开源项目. Redis 最主要的特点就是高性能,对于简单的键值读取速度可以达到10 ...

  5. 痞子衡嵌入式:在MDK开发环境下自定义安装与切换不同编译器版本的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下自定义安装与切换不同编译器版本的方法. Keil MDK 想必是嵌入式开发者最熟悉的工具之一了,自 2005 年 Ar ...

  6. VS2022 17.12.0 Preview2版本对Copilot的功能增强

    前提条件,使用最新版的17.12.0 Preview2,并且有有效的Copilot AI订阅,那么可以体验这个新鲜好用的功能 增强了Copilot AI对IEnumerable Visualizer的 ...

  7. Python 潮流周刊#69:是时候停止使用 Python 3.8了(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  8. C++ const常量指针

    const常量指针 const是C++关键字,译为常量,const指针即为常量指针. 分为三类 指向const的指针 const指针 指向const的const指针 指向const的指针 表示指向区域 ...

  9. Spring —— 注解开发(bean管理)

    注解定义bean       纯注解开发(无需配置文件)       bean作用范围    bean生命周期   

  10. /proc/slabinfo 介绍

    slabinfo - version: 2.1 # name <active_objs> <num_objs> <objsize> <objperslab&g ...