memset()函数使用详解


一、memset函数原型

void *memset(void *src, int value, size_t n);

这里srs可以是数组名,也可以是指向某一内存空间的指针;
value为要填充的值;
n为要填充的字节数,通常为sizeof(s);
函数的功能:将指针变量 src 所指向的前 n 字节的内存单元用一个“整数” value 替换,注意 value是 int 型。src 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。

二、使用步骤

1.加入头文件和命名空间

代码如下(示例):


#include <string.h>
using namespace std;

2.数组初始化

代码如下(示例):

    char str[20];
    char *pt = str;
    memset(pt, 0, sizeof(str));  //将str数组初始化为0

3.自定义类初始化

我们自定义的类或者结构体中,通常会定义 int,char,double等 内置型变量,在构造函数中一句句的将他们初始化为0显得很麻烦,所以可以直接memset(this, 0, sizeof *this);将整个对象的内存全部置为 0。对于这种情形可以很好的工作,但是下面几种情形是不可以这么使用的:

1.类含有虚函数表:将破坏虚函数表,后续调用虚函数时将出现异常;
2. 类中含有 C++类型的对象:例如,类中定义了一个 vector 的对象,因为在构造函数体的代码执行之前就对 vector 对象完成了初始化,假设 vector 在它的构造函数里分配了内存,那么我们这么一做就破坏了 vector 对象的内存。

代码如下(示例):

	memset(this,0,sizeof(*this))
  • 3
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 `memset` 函数清空 CAN FIFO 之前,需要确保该 FIFO 是可以被清空的。因为 CAN FIFO 通常是由硬件实现的,而不能直接访问其中的每一个字节,因此需要通过 CAN 控制器提供的接口来清空 FIFO。 如果 CAN 控制器提供了清空 FIFO 的接口,那么最好使用该接口来清空 FIFO。如果没有提供该接口,那么可以考虑使用 `memset` 函数来清空 FIFO。但是需要注意,使用 `memset` 函数清空 FIFO 时需要确保清空的字节数与 FIFO 的大小相等。 下面是一个使用 `memset` 函数清空 CAN FIFO 的示例代码: ```c CAN_HandleTypeDef hcan; // CAN句柄 // 清空CAN FIFO void clearCANFIFO(void) { uint8_t* fifoBuffer = (uint8_t*)hcan.pRxMsg; // 获取FIFO缓冲区指针 uint32_t fifoSize = sizeof(CAN_RxHeaderTypeDef) + hcan.RxXferCount * sizeof(uint32_t); // 计算FIFO大小 memset(fifoBuffer, 0, fifoSize); // 使用memset函数清空FIFO缓冲区 } ``` 在上面的代码中,`hcan` 是 STM32 HAL 库中的 CAN 句柄,`pRxMsg` 是 CAN 句柄中的一个指向接收缓冲区的指针。通过将 `pRxMsg` 转换为 `uint8_t*` 类型,可以获取整个 FIFO 的缓冲区指针。`RxXferCount` 表示接收缓冲区中还剩余多少个数据帧需要接收。根据 CAN 接收缓冲区的数据结构,可以通过计算 `sizeof(CAN_RxHeaderTypeDef) + hcan.RxXferCount * sizeof(uint32_t)` 来得到整个 FIFO 的大小。最后,使用 `memset` 函数来清空整个 FIFO 缓冲区。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值