memset() 函数可以说是初始化内存的“万能函数”,常常也用来清空一个结构类型的变量或数组。通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为:

# include <string.h>
void *memset(void *s, int c, unsigned long n);
//第一个参数是地址(供操作的结构体或数组或指针)
//第二个是将设置每个字节的值(memset直接对字节操作)
//unsigned long n是初始化的字节数,并非元素个数
//总的作用:将s空间的前n个字节设置为c值

作用:

将s所指向的内存,往后n个字节空间全部置成c(如果不是整型,会对应ASCLL值)所以memset可以方便的清空一个结构类型的变量或数组

注意:第三个参数表示的是字节大小!

用法一:初始化内存

int a[10];
memset(a, 6, sizeof(int) * 10);//将数组每个字节初始化为6

当你输出a数组中每个元素的时候,会发现每个元素为101058054,为什么?因为memset操作的是字节!int类型中有四个字节,每个字节都是6,输出的时候是四个字节一起输出当然不是6了(所以一般用0初始化)

用法二:清空结构类型的变量或数组

struct sample_struct
{
     char csName[16];
     int iSeq;
     int iType;
};
struct sample_strcut stTest;//定义变量
....//经过一系列操作,想要清空结构体
memset(&stTest,0,sizeof(struct sample_struct));//全部置为零

细节:

1、memset() 的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。

2、memset 一般使用“0”初始化内存单元,而且通常是给数组或结构体进行初始化。一般的变量如 char、int、float、double 等类型的变量直接初始化即可,没有必要用 memset。如果用 memset 的话反而显得麻烦。当然,数组也可以直接进行初始化,但 memset 是对较大的数组或结构体进行清零初始化的最快方法,因为它是直接对内存进行操作的。

3、有人会问:“字符串数组不是最好用'\0'进行初始化吗?那么可以用 memset 给字符串数组进行初始化吗?也就是说参数 c 可以赋值为'\0'吗?”。虽然参数 c 要求是一个整数,但是整型和字符型是互通的。但是赋值为 '\0' 和 0 是等价的,因为字符 '\0' 在内存中就是 0。所以在 memset 中初始化为 0 也具有结束标志符 '\0' 的作用,所以通常我们就写“0”。

4、memset 函数的第三个参数 n 的值一般用 sizeof()  获取,这样提高兼容性,减少出错(在一些类对象和结构体中的内存大小计算往往考虑很多因素,很复杂,容易出错。注意,如果是对指针变量所指向的内存单元进行清零初始化,那么一定要先对这个指针变量进行初始化,即一定要先让它指向某个有效的地址。而且用memset给指针变量如p所指向的内存单元进行初始化时,n 千万别写成 sizeof(p),这是新手经常会犯的错误。因为 p 是指针变量,不管 p 指向什么类型的变量,sizeof(p) 的值都是 4。