memset 一般使用“0”初始化内存单元,通常是给数组或结构体进行初始化,或清空数组或结构体。
memset 函数声明为:
void *memset(void *str, int c, size_t n)
其功能是将 str 中当前位置后面的 n 个字节 (typedef unsigned int size_t )用 c 替换并返回 str 。
这里一定要注意:memset 函数是按字节对内存块进行初始化的。
对于 char 型的数组,可以将其初始化为任意一个字符。
![377dcd75a52850a09f5f2bfbc1a6ea09.png](https://i-blog.csdnimg.cn/blog_migrate/06eef02dbb9e7d752a228b3f1654a726.jpeg)
但对于 int 型的数组,由于 memset 函数按字节对内存块进行初始化,所以不能用它将 int 数组初始化为 0 和 -1 之外的其他值。
如下图所示,memset 赋值为 -1 或 0,最后的结果是正确的:
![d841a07c0b8333c97bbbe326a9bee9a9.png](https://i-blog.csdnimg.cn/blog_migrate/55203b101f890c95dc161c5915ad64c8.jpeg)
![58de51f690d9269b687bb9c151e71144.png](https://i-blog.csdnimg.cn/blog_migrate/aaf3e68f2ca38f140873705e6baa9c94.jpeg)
但使用memset赋值为-1和0以外的值,最终的结果并不是期望值。比如赋值为1,则如下图所示:
![2d848d0665ddb43af342bfb46a16230f.png](https://i-blog.csdnimg.cn/blog_migrate/3feb886faa8579c211e7e82a124ff283.jpeg)
因为 memset 是对每个字节进行赋值的,一个 int 为4字节,那么 memset 赋值时为二进制则为:
00000001 00000001 00000001 00000001 = 16843009