C语言 指针

当使用变量时出现长度不定,譬如在串口通信中,有些通信协议是不定长的,那么这个就应该使用指针;如果使用数组的话,会有下面这两个小问题,

要将数组的大小要定的比较大,已保证能够容纳最大的指令,这个相对于短小的指令来说就显得太浪费数组的资源了

有时候定义的数组很大,对系统的栈的内存会有不小的压力,因为在局部变量的使用都是在栈上

基于上面这两个问题,可以使用指针来优化,指针可以在申请时指定长度,不用像数组只要定义了大小就不可改变;此外,指针的分配是在堆内存的,这时需要注意就是不要让这个指针成为野指针,或者忘了释放导致内存泄露。

下面就以一个小例子来说明下,这个是在FreeRTOS下使用的函数,所以内存分配函数和释放函数与标准库不一样。

1. 定义:

BYTE * bybuf = NULL; //定义指针时赋值为NULL,避免该指针指到其他不可控的内存单元

2. 申请:

bybuf = (BYTE *)pvPortMalloc(Len);//分配内存,len:长度

//判断是否内存分配是否成功,若有NULL则内存分配失败

if(NULL == bybuf)

{

return eeror;

}

2. 初始化

memset(bybuf, 0, Len);//将bybuf指向的内存单元初始化为0,并不是必须的,因为下面立刻又对该内存进行操作,会别重新赋值

3. 使用

对指针指向的内存单元进行赋值操作

*bybuf = 0x11;

*(bybuf+1) = 0x10;

*(bybuf+2) = (BYTE)(screen_id>>8);

*(bybuf+3) = (BYTE)screen_id;

*(bybuf+4) = (BYTE)(control_id>>8);

*(bybuf+5) = (BYTE)control_id;

memcpy(bybuf+6, str, Len);

4. 释放

//使用完毕后,要释放该指针,并重新赋值为NULL

if(NULL != bybuf)

{

vPortFree(bybuf);

bybuf = NULL;

}

合起来的整个函数如下:

uint32_t SetTextValue(uint16_t screen_id, uint16_t control_id, uint8_t * str, uint16_t Len)

{

uint32_t error = SYS_ERROR;

BYTE *bybuf = NULL;

bybuf = (BYTE *)pvPortMalloc(Len+6);

if(NULL == bybuf)

{

return error;

}

*bybuf = 0xb1;

*(bybuf+1) = 0x10;

*(bybuf+2) = (BYTE)(screen_id>>8);

*(bybuf+3) = (BYTE)screen_id;

*(bybuf+4) = (BYTE)(control_id>>8);

*(bybuf+5) = (BYTE)control_id;

memcpy(bybuf+6, str, Len);

//使用bybuf

if(NULL != bybuf)

{

vPortFree(bybuf);

bybuf = NULL;

}

return error;

}

c语言中buf内容怎么给指针,C语言 指针的使用相关推荐

  1. c语言定义node类型指针,C语言指针的概念

    在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍.为了正确地访问 ...

  2. c语言中什么函数可以作为虚函数,C++语言中的“虚函数”就像C语言中的指针,必须要弄懂的...

    上一节较为详细的讨论了C++语言中基类被派生类继承过程中的内存模型,尤其较为详细的分析了虚函数及其虚表.虚表指针在内存中是如何分布,如何存储的,这对于理解C++语言中的"动态绑定" ...

  3. c语言中5l是数值或字符常量,C语言练习题-选择题(带答案)

    以下为<C语言练习题-选择题(带答案)>的无排版文字预览,完整格式请下载 下载前请仔细阅读文字预览以及下方图片预览.图片预览是什么样的,下载的文档就是什么样的. C语言练习题-选择题(带答 ...

  4. c语言中int的取值范围_c语言入门(1)

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  5. c语言中point的用法_关于C语言Switch语句,先学这些技巧够不够?

    一.C语言中switch的用法 1.switch后面括弧内的[表达式],ANSI标准允许它为任何类型: 2.当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,否则,就 ...

  6. c语言中3%3e2%3e1的值,C语言--ch2--数据类型和表达式.ppt

    C语言--ch2--数据类型和表达式 第二章 数据类型和表达式 2.1 数据类型 在C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类. 其中基本数据类型可分为: 整型:整数 ...

  7. matlab for判断语句,matlab使用笔记(一)——matlab语言中if、for语句与C语言中的差别...

    好久没用matlab编写程序,上周在亲导师面前,愣生生是2小时没编出一选择函数的程序.羞愧至极,愤而写之.主要内容是matlab语言中与c语言中if.for语句的差别. 突然插一下!!!end.end ...

  8. 在c语言中,字符串topt65的长度是,c语言程序设计期末考试试题(含答案)123612210...

    <c语言程序设计期末考试试题(含答案)123612210>由会员分享,可在线阅读,更多相关<c语言程序设计期末考试试题(含答案)123612210(10页珍藏版)>请在人人文库 ...

  9. c语言中eles后面分号的作用,C语言 if else 语句详细讲解

    前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条.第三条--一直到最后一条语句. 但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因为年龄不够 ...

最新文章

  1. 未来计算机体系结构,华中科大金海:未来是计算机体系结构的“黄金十年” 要培养大量创新人才...
  2. 禁止蒙层底部页面跟随滚动
  3. Binder Driver浅析:Binder线程池
  4. JAVA中的onkey_onKeyListener无法在虚拟键盘上工作
  5. 常用shader固有函数
  6. 计算机系统基础:总线结构知识笔记
  7. ado.net操作数据库
  8. 多个小int的乘法小心溢出哦(记洛谷P1615题WA的经历,Java语言描述)
  9. 信息学奥赛一本通(2026:【例4.12】阶乘和)
  10. Processing编程学习指南1.5 颜色透明度
  11. 【sklearn第二讲】基于sklearn的机器学习
  12. Cisdem PDF Converter OCR使用教程:在 Mac 上将PDF 转换为 Word
  13. 1496.数括号法求广义表深度
  14. 迅雷离线下载怎么使用?迅雷离线下载使用方法
  15. push rejected by remote
  16. 【参赛作品23】华为OpenGauss数据库安装与使用
  17. 怎么生成a类型的对象 java_用一个 java 程序! 写一个类A, 该类创建的对象可以调用方法f输出英文字母表,然后再编写...
  18. 【白帽子讲Web安全】第二章 浏览器安全
  19. GCC源代码分析(1): GCC中的树
  20. SpringBoot项目中post请求,参数丢失,偶尔丢失,发现问题

热门文章

  1. 负载均衡SLB新功能介绍
  2. 中国加速计算市场第二名,宁畅正领跑“智能算力定制”赛道
  3. 低代码发展专访系列之七:低代码的火爆需要不一样的声音么?
  4. 阿里云推出“磐久”云原生服务器系列 能效和交付效率大幅提升
  5. 华为云专属月·行业深耕专项行动正式开启
  6. 【我想进大厂】Redis夺命连环11问
  7. 两大硬件设计被OCP官方接受,腾讯成国内互联网公司第一家
  8. 分布式精华问答 | 分布式与集群的区别是什么?
  9. python django实例_python django 模板实例
  10. vue2.0项目部署到服务器_vue项目运行npm run build打包后如何发布到服务器?