嵌入式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++中)。
- 正确做法:初始化为 0 是可以的(因为全字节为0就是整型0);初始化为 -1 也可以(因为全字节为0xFF就是整型-1)。其他值通常用
-
长度参数容易写错:第二个参数
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++) |
元素 | 按元素类型赋值,更安全且不限于字节 |

浙公网安备 33010602011771号