在使用 memset
、memcpy
等函数时,需要指定待操作的内存块的大小。在一些情况下,可能错误地传递某个指针的大小,从而导致问题。
void copy_buffer(char dest[114], char src[114])
{
memcpy(dest, src, sizeof(dest));
}
这段代码看上去很正确,但是一旦我们写出“正常”的形式:
void copy_buffer(char *dest, char *src)
{
memcpy(dest, src, sizeof(dest));
}
显然这是错误的。
struct something *p = &x;
// many lines ...
memset(p, 0, sizeof(p));
有时很容易误写出这样的 memset
调用。
编译时开启 -Wsizeof-pointer-memaccess
警告选项 (被 -Wall
包含)。警告消息示例:
test.c:10:15: 警告:argument to
sizeof
invoid* memset(void*, int, size_t)
call is the same expression as the destination; did you mean to dereference it?[-Wsizeof-pointer-memaccess]
根据警告进行修正即可。
为了提高代码可读性,可以用 std::fill
或者 std::copy
代替 memset
和 memcpy
。