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;
}