C memset() 语法
memset() 是 C 语言 <string.h> 或 <memory.h> 标准库的一个函数,它用于将内存区域中前 n 个字节设置为一个指定的值。
语法:
memset(src, ch, n)说明:
memset() 函数接收以下 3 个参数。
src(void*):指向内存区域的指针。ch(int):要设置的值(是一个字符)。n(size_t):要设置的字节数。
memset(src, ch, n) 表示从 src 指向的内存位置开始,将其后连续的 n 个字节都设置为由 ch 转换而来的字节值。
提示:
- memset 是 “memory set” 的缩写。
- memset() 函数用于 “设置” 内存中的字节,而 memcpy() 函数用于 “复制” 内存中的字节。
C memset() 摘要
| 使用频率 | 高 |
|---|---|
| 修改字符串 | 是 |
| 官方文档 | 查看 |
C memset() 示例
接下来,我们通过几个简单的例子来讲解一下 C memset() 函数是如何使用的。
示例 1:memset() 基本用法
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[20];
// 将 str 前 5 个字符设置为 'B'
memset(str, 'B', 5);
// 将 str 第 6 个字符设置为 '\0'
str[5] = '\0';
// 打印结果
puts(str);
printf("%d", strlen(str));
return 0;
}运行结果如下。
BBBBB
5分析:
在这个例子中,memset(str, 'B', 5) 表示将 str 前 5 个字符设置为 'B'。
示例 2:将字符数组清零 ( 初始化 )
#include <stdio.h>
#include <string.h> // 或 #include <memory.h>
int main(void)
{
char buffer[20];
// 使用 memset() 将整个 buffer 清零
memset(buffer, 0, sizeof(buffer));
// 打印 buffer 的内容(作为字符串,会打印空字符串,因为第一个字节是 '\0')
printf("清零后的 buffer (字符串): \"%s\"\n", buffer);
// 逐个打印字节值
printf("清零后的 buffer (字节值): ");
for (size_t i = 0; i < sizeof(buffer); i++) {
printf("%d ", buffer[i]);
}
printf("\n");
return 0;
}运行结果如下。
清零后的 buffer(字符串): ""
清零后的 buffer(字节值): 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0分析:
在这个例子中,我们尝试使用 memset() 将一个字符数组的所有字节设置为 0。首先声明了一个大小为 20 的字符数组 buffer,其初始内容是不确定的。
然后,memset(buffer, 0, sizeof(buffer)) 这句代码表示将 buffer 数组中的所有 20 个字节都设置为 0。由于 C 语言中的字符串是以字节值 0('\0')作为结束符的,当尝试将 buffer 作为字符串打印时,由于第一个字节就是 0,所以会打印出一个空字符串。
最后,我们通过一个 for 循环 逐个打印出 buffer 数组中每个字节的整数值,这也证明了所有的字节都已经被成功地设置为了 0。
示例 3:使用特定字符填充内存
#include <stdio.h>
#include <string.h>
int main(void)
{
char buffer[20];
// 使用 memset 用 '#' 填充 buffer 的前 10 个字节
memset(buffer, '#', 10);
// 在第 10 个字节位置手动添加终止符,以便按字符串打印
buffer[10] = '\0';
printf("%s\n", buffer);
return 0;
}运行结果如下。
##########分析:
在这个例子中,我们将字符 '#' 的 ASCII 值 填充到缓冲区的每个字节中。为了能够使用 “%s” 按字符串打印,我们在填充的末尾手动添加了终止符 '\0'。
memset() 的应用场景
在实际开发中,memset() 函数主要用于将一块内存区域快速填充为某个特定字节值,它主要应用于以下场景。
- 初始化缓冲区或数组为零。
- 在处理敏感信息后清零内存区域,以防止信息泄露。
- 使用特定模式填充内存进行调试。
注意: 在使用 memset() 初始化非字符类型的数组(如 int 数组、float 数组、结构体数组等)时,我们需要非常小心。由于 memset() 是按字节操作的,因此只有将所有字节设置为 0 或 -1 时,才能可靠地将整数元素初始化为 0 或 -1。对于其他值,应该使用循环或其他适当的方式来进行初始化。
