常州个人网站建设,能打开任何网站的浏览器,中铁建设集团有限公司招聘信息,更改网站图片C语言 指针当使用变量时出现长度不定#xff0c;譬如在串口通信中#xff0c;有些通信协议是不定长的#xff0c;那么这个就应该使用指针#xff1b;如果使用数组的话#xff0c;会有下面这两个小问题#xff0c;要将数组的大小要定的比较大#xff0c;已保证能够容纳最…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;*(bybuf1) 0x10;*(bybuf2) (BYTE)(screen_id8);*(bybuf3) (BYTE)screen_id;*(bybuf4) (BYTE)(control_id8);*(bybuf5) (BYTE)control_id;memcpy(bybuf6, str, Len);4. 释放//使用完毕后要释放该指针并重新赋值为NULLif(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(Len6);if(NULL bybuf){return error;}*bybuf 0xb1;*(bybuf1) 0x10;*(bybuf2) (BYTE)(screen_id8);*(bybuf3) (BYTE)screen_id;*(bybuf4) (BYTE)(control_id8);*(bybuf5) (BYTE)control_id;memcpy(bybuf6, str, Len);//使用bybufif(NULL ! bybuf){vPortFree(bybuf);bybuf NULL;}return error;}