memset
memset note
memset函数原型为:
**void *memset(void *buffer,int c,int count)**包含在sting.h©和cstring(C++)头文件中
buffer为数组或指针,c为赋给buffer的值,count是buffer的内存长度
memset的操作对象是内存空间
memset函数通常为新分配的内存做初始化工作
且初始化赋值是对连续空间统一赋值
可用于将一段内存空间全部设置为某个值或字符串,一般可用于字符串初始化
Q1:
- 为什么memset函数通常为新分配的内存做初始化工作?
A1:
首先看一下对字符数组进行memset操作
示例代码1(C)
#include<stdio.h>
#include<string.h>
int main(void)
{
char str[5];//内部定义变量的该字符数组无初始值
memset(str,'6',sizeof(str)); //初始化字符数组str,所有值为6
printf("%d\n",sizeof(char));
printf("%d\n",sizeof(str));
for(int i=0;i<5;i++}
printf("%c%c",str[i],(i==4?'\n':' ')); //打印看结果
return 0;
}
结果显示为:
1
5
6 6 6 6 6
接下来看对int数组进行memset操作会发生什么
示例代码2(C)
#include<stdio.h>
#include<string.h>
int main(void)
{
int a[5];
memset(a,6,sizeof a);
printf("%d\n",a[0]);
return 0;
}
结果显示为:
101058054
Q2:
- 这串数字显然不是我们以为的6,为什么会产生这样的结果?
A2:
- 从函数原型开始探究 void *memset(void buffer,int c,int count)
memset函数操作对象是内存空间,且是一个一个逐字节地进行操作,char类型是一个字节的,故可以使用,而int 是四个字节的,故直接进行操作后会产生诡异的结果,其实原操作只能给int类型赋初值0,即memset(a,0,sizeof a)是可行的。
事实上int或double等类型数组初始化有其他办法,最朴素的方法是用for循环,当然也可以使用memset函数,但需要调整参数输入方式为:memset(a, 6, sizeof(int)5);
示例代码3(C)
#include<stdio.h>
#include<string.h>
int main(void)
{
int a[5];
memset(a,0,sizeof(int)*5);
for(int i=0;i<5;i++)
printf("%d%c",a[i],(i==4?'\n':' '));
return 0;
}
结果显示为:
0 0 0 0 0
初始化成功
现在我们再来看看另一种类型:bool型
由于bool内存单位也是一个字节,故可按照示例代码1一样进行操作
示例代码3(C)
#include<stdio.h>
#include<string.h>
int main(void)
{
bool a[5];
memset(a,1,sizeof a); //1-true,0-false
printf("%d",a[0]);
return 0;
}
结果显示为:
1
利用memset函数可以轻易地清空结构体变量或数组
示例代码4(C)
#include<stdio.h>
#include<string.h>
typedef struct struct_test{
int num;
char ch;
}itest;
int main(void)
{
itest tr;
memset(&tr,0,sizeof(tr));
printf("%d\n",tr.num);
printf("%c\n",tr.ch);
return 0;
}
结果显示为:
0
postscript: char型变量赋值0是就是‘\0’,故打印结果为空。
Q3:
- 为什么memset不适用于二维及以上的数组初始化赋值?
A3:
- 因为多维数组的空间未必连续,故用memset函数进行连续内存空间的赋值是无意义的