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

本文介绍了C语言指针在处理不定长数据,如串口通信中的优势,对比了指针与数组在内存管理和效率上的区别。通过一个FreeRTOS环境下的函数示例,详细阐述了如何定义、分配、初始化、使用和释放指针内存,强调了防止野指针和内存泄漏的重要性。
摘要由CSDN通过智能技术生成

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值