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。