memset
有时很有用,但一些初学者对其有不切实际的幻想。
int arr[114514];
int main()
{
memset(arr, 1, sizeof(arr));
// ...
}
选手试图用 memset
将 arr
全部初始化成 1
,然而实际上由于 memset
只能进行字节级别的初始化,导致数组中的元素实际上被初始化为 0x01010101
。
没有很好的检查方法,只能人工审查所有 memset
调用。但是由于一个程序通常不会有很多 memset
调用,查错难度仍然判定为“低”。
对于示例,最简单的修正方法是改用 std::fill
进行初始化:
fill(arr, arr + 114514, 1);
如果能够习惯的话,建议总是使用 fill
代替 memset
初始化数组。在 -O2
优化级别下,编译器会自动尝试将 fill
优化成 memset
,因此不用担心效率问题。
如果一定要使用 memset
,则尽量保证只使用几个广为人知的特殊数值,如 0
、-1
、0x3f
、0x7f
。