memset函数及其⽤法,C语⾔memset函数详解
memset函数的头⽂件是string.h
在前⾯不⽌⼀次说过,定义变量时⼀定要进⾏初始化,尤其是数组和结构体这种占⽤内存⼤的数据结构。在使⽤数组的时候经常因为没有初始化⽽产⽣“烫烫烫烫烫烫”这样的野值,俗称“乱码”。
每种类型的变量都有各⾃的初始化⽅法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进⾏初始化⼯作。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为:
# include <string.h>
void *memset(void *s, int c, unsigned long n);
函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元⽤⼀个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进⾏初始化。
memset() 的作⽤是在⼀段内存块中填充某个给定的值。因为它只能填充⼀个值,所以该函数的初始化为原始初始化,⽆法将变量初始化为程序中需要的数据。⽤memset初始化完后,后⾯程序中再向该内存空间中存放需要的数据。
memset ⼀般使⽤“0”初始化内存单元,⽽且通常是给数组或结构体进⾏初始化。⼀般的变量如 char、int、float、double 等类型的变量直接初始化即可,没有必要⽤ memset。如果⽤ memset 的话反⽽显得⿇烦。
当然,数组也可以直接进⾏初始化,但 memset 是对较⼤的数组或结构体进⾏清零初始化的最快⽅法,因为它是直接对内存进⾏操作的。
这时有⼈会问:“字符串数组不是最好⽤'\0'进⾏初始化吗?那么可以⽤ memset 给字符串数组进⾏初始化吗?也就是说参数 c 可以赋值为'\0'吗?”
可以的。虽然参数 c 要求是⼀个整数,但是整型和字符型是互通的。但是赋值为 '\0' 和 0 是等价的,因为字符 '\0' 在内存中就是 0。所以在 memset 中初始化为 0 也具有结束标志符 '\0' 的作⽤,所以通常我们就写“0”。
memset 函数的第三个参数 n 的值⼀般⽤ sizeof()  获取,这样⽐较专业。注意,如果是对指针变量所指向的内存单元进⾏清零初始化,那么⼀定要先对这个指针变量进⾏初始化,即⼀定要先让它指向某个有效的地址。⽽且⽤memset给指针变量如p所指向的内存单元进⾏初始化时,n 千万别写成 sizeof(p),这是新⼿经常会犯的错误。因为 p 是指针变量,不管 p 指向什么类型的变量,sizeof(p) 的值都是 4。
下⾯写⼀个程序:
# include <stdio.h>
# include <string.h>
int main(void){
int i; //循环变量
char str[10];
char *p = str;
memset(str, 0, sizeof(str)); //只能写sizeof(str), 不能写sizeof(p)
for (i=0; i<10; ++i)
{
printf("%d\x20", str[i]);
}
printf("\n");
return 0;
}
根据memset函数的不同,输出结果也不同,分为以下⼏种情况:memset(p, 0, sizeof(p));  //地址的⼤⼩都是4字节
0 0 0 0 -52 -52 -52 -52 -52 -52
memset(p, 0, sizeof(*p));  //*p表⽰的是⼀个字符变量, 只有⼀字节0 -52 -52 -52 -52 -52 -52 -52 -52 -52
memset(p, 0, sizeof(str));
0 0 0 0 0 0 0 0 0 0
memset(str, 0, sizeof(str));
0 0 0 0 0 0 0 0 0 0
c++中string的用法
memset(p, 0, 10);  //直接写10也⾏, 但不专业
0 0 0 0 0 0 0 0 0 0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。