算法竞赛中经常会使用memset来给数组赋值,有时候会发现给数组赋除0、-1
外的其他值,似乎会产生一些错误;
从c++官网,我们可以得到memset
的声明及解释;
void * memset ( void * ptr, int value, size_t num );
它的作用是:Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).
意思是将ptr
指向的num
个字节,用value
来赋值,这个value
被解释成unsigned char
;
1 | void *(memset)(void *s, int c, size_t n) |
上面是memset
的源码;比如这段程序memset(a, 1, sizeof(a));
,a
是int
型数组,在源码中,将整形1赋值给无符号char
,那么就会截断整型,将低位的字节0x01
赋值给a
的每一个字节,memset
中a
被视为一个一个字节;因此最后得到的a
中,每个int
都是0x01010101
;在程序中输出memset
后的a
中的元素,得到的值为16843009
,它的十六进制也确实是0x01010101
;