一、memset()函数
memset函数说明: 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。。
1.头文件:
#include <string.h>
2.格式:
void *memset(void *str, int c, size_t n)
3.返回值:
返回一个指向存储区 str 的指针。
4.参数解析:
str → 指向要填充的内存块。
c → 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n → 要被设置为该值的字节数。
以上来源:void *memset(void *str, int c, size_t n) - C语言在线手册 (dba.cn)
memset()函数通常用于初始化内存或者设置内存区域。以下是一些 常见案例:
示例一:初始化字符数组中的元素
#include <stdio.h>
#include <string.h>
int main() {
char arr[10];
memset(arr, 'A', 3); //将整个数组
printf(" array: %s\n", arr); //打印初始化的数组
//输出: array: AAA
return 0;
}
示例二:初始化字符数组
#include <stdio.h>
#include <string.h>
int main() {
char arr[10];
memset(arr, 'A', sizeof(arr)); //将整个数组初始化为字符‘A’
printf("Initial array: %s\n", arr); //打印初始化的数组
return 0;
}
输出结果:
Initial array: AAAAAAAAAAp@
注意:这里虽然数组被设置为'A',但由于C语言中字符串是以空字符('\0')结束的,而这里没有明确地添加空字符,所以这并不是一个有效的C字符串。
如何解决?在使用数组之前为其分配内存并正确地初始化它。
输出结果中的"p@"是内存中的内容,这可能是由于在数组arr
之后紧跟着的其他内存区域的内容。为什么初始化数组的前3个元素时没有异常出现?字符数组是以空字符'\0'
结尾的,我们只初始化了3个元素,而后面的内容是未初始化的,所以不会出现异常。
解决方法:手动添加空字符:在将字符数组设置为特定值之后,手动添加一个空字符('\0')作为字符串的结束标记。
#include <stdio.h>
#include <string.h>
int main() {
char arr[10];
memset(arr, 'A', sizeof(arr));
arr[sizeof(arr) - 1] = '\0'; // 添加空字符作为字符串结束标记
printf("Initial array: %s\n", arr);
return 0;
}
输出:
Initial array: AAAAAAAAA
示例三:设置内存区域为零
#include <stdio.h>
#include <string.h>
int main() {
int arr[10];
memset(arr, 0, sizeof(arr)); //将整个数组初始化为零值
printf("Array after setting to zero: ");
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]); //打印初始化的数组中的每一个元素
}
return 0;
}
输出:
Array after setting to zero: 0 0 0 0 0 0 0 0 0 0
示例四:初始化结构体
#include <stdio.h>
#include <string.h>
struct Person {
char name[50];
int age;
};
int main() {
struct Person p;
memset(&p, 0, sizeof(p)); // 初始化结构体 p 的内存区域为零值
strcpy(p.name, "LiMing"); // 设置 name 成员为 "LiMing"
p.age = 14; // 设置 age 成员为 14
printf("Person: %s, Age: %d\n", p.name, p.age);
return 0;
}
输出:
Person: LiMing, Age: 14