memset()函数介绍

首先来看函数原型

1
void *memset(void *str, int c, size_t n)
  • 解释:c实际上传入的应该是一个字符,占用1字节,根据str的地址,把c复制n次。
  • 作用:是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
  • 头文件:C中#include<string.h>,C++中#include<cstring>

使用方法与问题

0的情况

1
2
int dp[];
memset(dp,0,sizeof(dp));
  • int类型的变量一般占用4个字节,对每一个字节赋值0的话就变成了“00000000 00000000 000000000 00000000” (即10进制数中的0)

1的情况

1
memset(dp,1,sizeof(dp));  

这样可能会认为让整个dp数组里的每一个int变成1,其实不然。

在计算机中,1字节=8比特,就是8位二进制。char类型1字节,用8位二进制就可以表示,int类型8字节,用32位二进制表示。

以上代码执行后,dp数组的内容为 00000001 00000001 00000001 00000001 转化为十进制后不为1,因为
$$
00000001 00000001 00000001 00000001 = 16843009
$$
char(1) = 00000001

int(1) = 00000000 00000000 00000000 00000001

-1的情况

1
memset(dp,-1,sizeof(dp));  

赋值为-1的话,放的是 “11111111 11111111 11111111 11111111 ”(十进制的-1)

使用字符型进行初始化

1
2
char dp[];
memset(dp,'d',sizeof(char));

上述代码可以使得dp数组初始化100,%d输出可以见100。


使用到的工具