嵌入式C语言代码插桩常用函数

memset

memset 是 C/C++ 标准库中的一个内存操作函数,其核心功能是:将一块内存区域中的每个字节都设置为指定的值

简单来说,就是按字节填充内存


1. 函数原型

#include <string.h>

void *memset(void *s, int c, size_t n);
  • s:指向要填充的内存块的指针。
  • c:要设置的值(以 int 形式传入,但实际只取该值的低 8 位,即一个字节)。
  • n:要填充的字节数。
  • 返回值:返回指向 s 的指针(即原内存地址)。

2. 主要用途(实际应用场景)

  • 初始化数组或结构体为零:这是最常用的情况,可以快速清空数据。

    char buffer[1024];
    memset(buffer, 0, sizeof(buffer));  // 全部清零
    
  • 初始化结构体:防止结构体变量中的垃圾数据。

    struct Student stu;
    memset(&stu, 0, sizeof(stu));  // 将所有成员变量初始化为 0
    
  • 将内存设置为特定字符:比如将字符数组全部填充为空格或特定字符。

    char str[50];
    memset(str, 'A', 10);  // 前10个字节设为 'A'
    

3. 重要注意事项(极易出错)

  • 只适用于字节(Byte)memset 是按字节赋值的。对于 int 数组,如果想全部初始化为 1,写成 memset(arr, 1, sizeof(arr)) 是错误的——这会把每个字节都设为 0x01,导致每个 int 变成 0x01010101(即 16843009),而非 1。

    • 正确做法:初始化为 0 是可以的(因为全字节为0就是整型0);初始化为 -1 也可以(因为全字节为0xFF就是整型-1)。其他值通常用 for 循环或 std::fill(C++中)。
  • 长度参数容易写错:第二个参数 n字节数,不是元素个数。

    • memset(arr, 0, sizeof(arr)); (正确)
    • memset(arr, 0, 10); (错误:只清空前10个字节,而非10个元素)
  • 对非POD类型(C++)需谨慎:在C++中,对包含虚函数或非平凡构造函数的对象使用 memset,会破坏其内部结构,导致未定义行为。C++中应优先使用构造函数或 std::fill


4. 经典示例

#include <stdio.h>
#include <string.h>

int main() {
    int arr[5];
    
    // 清零(唯一安全的非0/非-1初始化方式)
    memset(arr, 0, sizeof(arr));
    for(int i=0; i<5; i++) printf("%d ", arr[i]);  // 输出: 0 0 0 0 0

    // 将int数组每个字节设为0xFF => 每个int变为-1
    memset(arr, 0xFF, sizeof(arr));
    printf("%d", arr[0]);  // 输出: -1

    return 0;
}

5. 与其他函数的对比

函数 单位 功能
memset 字节 用同一个字节填充内存
memcpy 字节 将一块内存复制到另一块
memcmp 字节 比较两块内存是否相同
strcpy 字符 复制字符串(遇 \0 停止)
std::fill (C++) 元素 按元素类型赋值,更安全且不限于字节
posted @ 2026-08-13 09:23  芋圆院长  阅读(14)  评论(0)    收藏  举报