memset()是一个来自于string库的函数,正规用法是初始化char类型的数组。因为char类型只占1个字节,memset按字节赋值后,会将char类型数组的所有元素变为你指定的值。但是4字节的int类型在被memset赋值后,会被重复四次:如使用memset赋值1到int数组后,1转为二进制的一个字节为00000001,赋值完成后为00000001000000010000000100000001,即十进制的16843009。因此不能直接对int数组memset赋值目标值。也因此,将数组赋值为0可以正常使用。
还有一个应用是,对一个int数组使用memset( , 0xff, sizeof());时,赋值完成后每个元素为11111111111111111111111111111111,即-1。
除了赋值0或-1外,有时也需要将数组初始化为极大值。下面是几个常用的赋值。
memset(arr, 0x7f, sizeof(arr)); //set int to 2139062143 memset(arr, 0x80, sizeof(arr)); //set int to -2139062144 memset(arr, 0x7f, sizeof(arr)); //set double to 1.38242e+306 memset(arr, 0xfe, sizeof(arr)); //set double to -5.31401e+303
注意,由于上面的赋值接近了数据类型的上限,在极大值相加(如最短路算法有时会出现)时会出现溢出。
这里推荐一个比较合适的常量:0x3f3f3f3f,转换为十进制仍达到1061109567,为109级别,正常情况下不会小于正常常数值。而0x3f3f3f3f * 2 = 2122219134,仍没有超过int类型的上限232。而且,由于0x3f3f3f3f的每个字节均相同,在memset时直接使用
memset(arr, 0x3f, sizeof(arr));
即可完成最短路算法中常用的极大值初始化。