目录
在编程中,经常需要将某一块内存中的数据全部设置为指定的值,譬如在定义数组、结构体这种类型变量时,通常需要对其进行初始化操作,而初始化操作一般都是将其占用的内存空间全部填充为 0。
1 memset 函数
memset
函数是C语言标准库中的一个函数,用于将一块内存中的所有字节设置为特定的值。这通常用于初始化一个数组或结构体为零值,或者在释放内存前清除敏感数据。函数原型如下:
void *memset(void *s, int c, size_t n);
s
:指向要填充的内存块的指针。c
:要设置的值,通常用整数的ASCII码表示字符,例如'0'
表示 ASCII 码为 48 的字符。n
:要设置的字节数。
memset
函数常用于以下几种情况:
- 初始化数组或结构体为零:
memset(&myStruct, 0, sizeof(myStruct));
- 清除敏感数据:例如在释放包含密码的内存前,使用
memset
来覆盖数据。 - 创建具有特定填充字符的字符串数组:
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'
结尾。最后,尽管可能不是有效的字符串,程序仍尝试打印整个字符串数组的内容。 程序运行结果如下: