#include <cstdio>
#include <cstring>
int main() {
int a[5];
memset(a, -1, sizeof a);
for (int i = 0; i < 5; i++) {
printf("%d\n", a[i]);
}
return 0;
}
如上代码使用memset对一个数组进行初始化,输出的结果如下:
-1
-1
-1
-1
-1
但如果是初始化 代码写为memset(a, 1, sizeof a);
,发现如下的结果
16843009
16843009
16843009
16843009
16843009
那么为什么前一个初始化可以呢?
首先看memset函数定义
void *memset(void *str, int c, size_t n);
这里,str是指向要填充的内存块的指针,c是要设置的值(虽然是int类型,但实际上只会使用该值的低8位),n是要设置的字节数。
那么其中关键在于会对要填充的内存块每一个字节8位都存上 c 里面的低8位内容。
当你使用memset对一个int数组使用-1进行填充时,由于-1在内存中以补码形式表示,对于一个32位的系统,-1的二进制表示为11111111 11111111 11111111 11111111
。因此,当memset用-1填充时,它实际上将每个字节都设置为11111111
,这正好使得每个int元素都变为了-1。
然而,当尝试用1来填充时,情况就不同了。1的二进制表示为00000001
(只考虑一个字节)。如果你用1来填充一个int数组,memset会将每个字节都设置为00000001
。对于32位的int来说,每个int元素将会是00000001 00000001 00000001 00000001
,这并不等于1。对于一个32位系统,这个值实际上是16843009,而不是1。
其他用法还有可以初始化一个int 类型的数组内容全为 INF的0x3f3f3f3f,那么只需要写成这样即可memset(a, 0x3f, sizeof a);