我可以在“字节数”设置为零的情况下调用 memcpy()和 memmove()吗?

我需要治疗的情况下,我实际上没有移动/复制与 memmove()/memcpy()作为边缘情况

int numberOfBytes = ...
if( numberOfBytes != 0 ) {
memmove( dest, source, numberOfBytes );
}

或者我应该直接调用函数而不检查

int numberOfBytes = ...
memmove( dest, source, numberOfBytes );

是否需要在前面的代码片段中执行检查?

46374 次浏览

根据 C99标准(7.21.1/2) :

声明为 size_t n的参数指定了 function, n can have the value zero on a call to that function. Unless explicitly stated 否则在这个子句中的特定函数的描述中,指针参数 如7.1.4所述,在这样的调用中,a 定位字符的函数找不到任何匹配项,比较两个 字符序列返回零,复制字符的函数复制零 角色。

所以答案是否定的; 检查是不必要的(或者是; 您可以通过零)。

正如@You 所说,标准规定 memcpy 和 memmove 应该毫无问题地处理这种情况; 因为它们的实现通常类似于

void *memcpy(void *_dst, const void *_src, size_t len)
{
unsigned char *dst = _dst;
const unsigned char *src = _src;
while(len-- > 0)
*dst++ = *src++;
return _dst;
}

除了函数调用之外,你甚至不应该有任何性能损失; 如果编译器支持这类函数的内部/内联,额外的检查甚至可能使代码稍微慢一点,因为检查已经在同时完成了。