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函数先将内存空间设定初始化值。好比定义了一个int i ,i 不能不赋值就直接使用。

首先看一下对字符数组进行memset操作

示例代码1(C)
#include
#include
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
#include
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
#include
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
#include
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
#include
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函数进行连续内存空间的赋值是无意义的


你可能感兴趣的:(C)