1. memset()函数原型是extern void *memset(void *buffer, int c, int count)
buffer:为指针或是数组,
c:需要赋给buffer的值,
count:是buffer的长度.
这个函数多用于清空数组. 如:原型是memset(buffer, 0, sizeof(buffer))
Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为
‘ ’或 ‘/0’;
例: char a[100];
memset(a, '/0', sizeof(a));
memset可以方便的清空一个结构类型的变量或数组.
如下:
struct my_struct
{
char Name[16];
int Seq;
int Type;
};
针对变量: struct my_struct Test;
一般情况下,清空Test的方法;
Test.Name[0] = '/0';
Test.Seq = 0;
Test.Type = 0;
//使用memset 就非常方便了
memset(&Test, 0 , sizeof(struct my_struct));
//如果是数组
struct my_struct TEST[10];
memset(TEST, 0 , sizeof(struct my_struct) * 10);
2.将p所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASSCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作;
用法: memset(void *p , char ch ,unsigned n);
那么所指向的某一块内存中的每个字节的内容全部设置为ch所指定的ASSCII值有什么用呢?
为什么说,这个函数通常为新申请的内存做初始化工作 ?
解释: 刚分频的内存空间,或者是被你用过的内存空间的数据不是固定的, 为了避免这些无用的数据对程序带来影响, 可以用memset 把这些内存里面的数据设置成某个数值, 一般情况下设置成 0, 当然,如果你的程序不会受这些数据影响,就不用做这个工作了, 所谓初始化, 是指将你定义的变量或申请的空间赋予你所期望的值, 例如 int i = 0; 就表明定义了一个变量 i,并初始化为0; 如果 int j = 3; 就表明定义了一个变量j, 并初始化为3;
但是对于大块的内存分配,这种发发当然不行, 如果 int arr[100] ;定义了数组arr ,包含100个元素, 如果写成 int arr[100] = 0;想将数组全部初始化为0 ,是不行的, 连编译器都不能通过, 这种情况下, 初始化有两种方法,:
①一种是一个一个的初始化, 用一个for循环来实现, for(int i = 0;i<100;i++) arr[i] = 0;就完成了数组的初始化,
② 另一种方法就是使用memset:一个语句就够了, memset(arr, 0 ,sizeof(int)*100);
其中: arr 数组的首地址, 0需要赋的值, sizeof(int) 求出int类型的长度,乘以100 就表示arr数组的整个长度
如果用了malloc分配的内存,一般只能使用memset来初始化了,用第一种方法显然不合适.
例如: char ch[10]
比如: memset(ch, 0 , 8); 就是把数组ch 的前八个地址设为0,后面的不一定为0, 比如刚开始
ch[1]='z',ch[9]='a',ch[9] = b, 经过 memset后,ch[1] 为0,而ch[8], ch[9]都不变
3.memset 函数详细说明
1) void *memset(void *s ,int c, size_t n)
作用: 将已经开辟内存空间 s的首个到n个字节的值设为值c.
2)memset() 函数常用于内存空间初始化; 比如:
char str[100];
memset(str, 0 , 100);