嵌入式Linux系统编程 — 4.4 memset、bzero函数内存填充

目录

1 memset 函数

2  bzero函数


在编程中,经常需要将某一块内存中的数据全部设置为指定的值,譬如在定义数组、结构体这种类型变量时,通常需要对其进行初始化操作,而初始化操作一般都是将其占用的内存空间全部填充为 0。

1 memset 函数

memset 函数是C语言标准库中的一个函数,用于将一块内存中的所有字节设置为特定的值。这通常用于初始化一个数组或结构体为零值,或者在释放内存前清除敏感数据。函数原型如下:

void *memset(void *s, int c, size_t n);
  • s:指向要填充的内存块的指针。
  • c:要设置的值,通常用整数的ASCII码表示字符,例如 '0' 表示 ASCII 码为 48 的字符。
  • n:要设置的字节数。

memset 函数常用于以下几种情况:

  1. 初始化数组或结构体为零:memset(&myStruct, 0, sizeof(myStruct));
  2. 清除敏感数据:例如在释放包含密码的内存前,使用 memset 来覆盖数据。
  3. 创建具有特定填充字符的字符串数组:memset(buffer, ' ', sizeof(buffer));

下面的示例程序提示输入一个字符串,然后输入一个用于填充的字符 c 和要填充的字节数 n。程序将使用 memset 函数来填充字符串之后的内存,并打印出填充后的字符串。

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

#define MAX_STR_LEN 100 // 定义字符串的最大长度

int main() 
{
    char str[MAX_STR_LEN]; // 存储用户输入的字符串
    char fillChar; // 存储用户输入的填充字符
    int n; // 存储用户输入的字节数

    // 获取用户输入的字符串
    printf("请输入一个字符串:");
    fgets(str, MAX_STR_LEN, stdin); // 使用fgets读取一行输入,包括空格
    // 去除可能读取的换行符
    str[strcspn(str, "\n")] = 0;

    // 获取用户输入的填充字符
    printf("请输入一个用于填充的字符:");
    scanf("%c", &fillChar); // 读取一个字符

    // 获取用户输入的字节数
    printf("请输入要填充的字节数:");
    scanf("%d", &n); // 读取一个整数
    // 确保n不大于字符串的最大长度
    n = n > MAX_STR_LEN ? MAX_STR_LEN : n;

    // 使用memset函数从字符串末尾开始向前填充n个字节
    memset(str + strlen(str), fillChar, n);
    // 打印填充后的字符串
    printf("填充后的字符串: %s\n", str);

    return 0;
}

程序运行的结果如下:

2 bzero函数

bzero 函数用于将一块内存区域的内容设置为零。它属于 BSD 系统调用,可能在某些系统上不可用或已被弃用,特别是在 POSIX 标准中,它已被 memset 函数取代。函数原型如下:

void bzero(void *s, size_t n);
  • s:指向要清零的内存块的指针。
  • n:要清零的字节数。
#include <stdio.h>
#include <string.h>
#include <strings.h> // 包含bzero函数的头文件

#define MAX_STR_LEN 100 // 定义字符串的最大长度

int main() 
{
    char str[MAX_STR_LEN]; // 存储用户输入的字符串

    // 获取用户输入的字符串
    printf("请输入一个字符串:");
    fgets(str, MAX_STR_LEN, stdin); // 使用fgets读取一行输入,包括空格
    // 去除可能读取的换行符
    str[strcspn(str, "\n")] = 0;

    // 使用bzero函数从字符串的开始位置清零n个字节
    bzero(str, sizeof(str));

    // 打印清零后的字符串
    // 注意:清零后的字符串可能不是有效的C字符串,因为它可能不以'\0'结尾
    printf("清零后的字符串: %s\n", str);

    return 0;
}

代码提示用户输入一个字符串,并使用 fgets 函数读取用户输入,包括空格,然后去除末尾的换行符。接着,使用 bzero 函数将整个字符串数组 str 清零,这会覆盖字符串数组的每个字节为 0,导致字符串不再是有效的C字符串,因为它不再以空字符 '\0' 结尾。最后,尽管可能不是有效的字符串,程序仍尝试打印整个字符串数组的内容。 程序运行结果如下:

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几度春风里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值