memset函数及其用法

memset函数及其用法

每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。 它是直接操作内存空间,mem即“内存”(memory)的意思。

该函数的原型为:

# include

void *memset(void *s, int c, unsigned long n);

函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。 s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。

memset 一般使用“0”初始化内存单元,而且通常是给数组或结构体进行初始化。 当然,数组也可以直接进行初始化,但 memset 是对较大的数组或结构体进行清零初始化的最快方法,因为它是直接对内存进行操作的。

一般的变量如 char、int、float、double 等类型的变量直接初始化即可,没有必要用 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

# include

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

memset(p, 0, 10); //直接写10也行, 但不专业 0 0 0 0 0 0 0 0 0 0

相关文章

彩票365苹果版怎么下载不了 竞彩周五047世界杯:塞尔维亚VS瑞士预测
365结束投注 职场人必知!长期使用电脑对身体的危害及应对办法
365体育投注网址亚洲下载 古代建筑上的风铃——随风而动,引风而歌
365体育投注网址亚洲下载 win7如何配置ip地址_win7台式电脑ip地址在哪更改
365结束投注 关于风投,你最想知道又不敢问的事
365体育投注网址亚洲下载 Four Angry Men战队Godv介绍-Four Angry MenGodv韦神个人资料