memset()函数对数组赋值问题
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 | int 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 | char dp[]; |
上述代码可以使得dp数组初始化100,%d输出可以见100。
使用到的工具
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 璃雲の部屋!