memset()
用于初始化工作,常为新申请的内存进行初始化工作,直接操作内存空间。
函数原型:
#include<string.h> //要包含这个头文件
void *memset(void* s, int c, unsigned long n);
函数功能:将指针变量s
所指向的前n
个字节的内存单元用一个“整数”c
替换,可以为任何数据类型的数据进行初始化。常用于对数组或结构体进行清零初始化。
函数参数:
s
:void *
型的指针变量,可以为任何类型的数据进行初始化c
:int
类型的变量,常为0
,为char
类型的数据初始化时,使用0
就相当于使用\0
初始化n
:一般用sizeof()
获取
Attention:
memset
函数赋值时以字节为单位
示例1:对int
型数组初始化
#include <stdio.h>
#include <string.h>
int main(){
int x[5];
memset(x, 1, sizeof(x));
for(int i=0; i<5; i++){
printf("%d\t", x[i]);
}
return 0;
}
输出结果:
16843009 16843009 16843009 16843009 16843009
已知int
类型占据内存4个字节,所以当使用memset
函数赋值1时,int
类型数组中每个元素的值为(0000000)1000000010000000100000001
共32位,转换位10进制为16843009。
所以对int
型这样的占据多个字节的元素赋值时,得到的值要自己算一下才能明白。
示例2:对char
类型数组初始化
#include<stdio.h>
#include<string.h>
int main(){
char str[5];
memset(str, 1, sizeof(str));
for(int i=0; i<5; i++){
printf("%d\t", str[i]);
}
return 0;
}
输出结果:5个1
1 1 1 1 1
char
类型数据占据内存1个字节,所以char
类型数组中每个元素被赋值为00000001
,转换为10进制为1。
示例3:对int/char
型变量初始化
#include<stdio.h>
#include<string.h>
int main(){
int x;
char c;
memset(&x, 1, sizeof(x));
memset(&c, '1', sizeof(c));
printf("%d\t%c", x, c);
return 0;
}
输出结果:
16843009 1
示例4:对结构体初始化
#include<stdio.h>
#include<string.h>
int main(){
struct student{
int ID;
char name[20];
}stu;
memset(&stu, 0, sizeof(stu));
//或memset(&stu, 0, sizeof(struct student));
printf("%d\t%s", stu.ID, stu.name);
return 0;
}
示例5:对结构体数组初始化
#include<stdio.h>
#include<string.h>
int main(){
struct student{
int ID;
char name[20];
};
struct student stus[10];
memset(stus, 0, sizeof(stus));
//或memset(stus, 0, sizeof(stus));
printf("%d\n", stus[0].ID);
printf("%s", stus[0].name);
return 0;
}