C memset() 函数

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。对于其他值,应该使用循环或其他适当的方式来进行初始化。

上一篇: memmove()

下一篇: memcmp()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号