我可以将设置为零的“字节数”调用memcpy()和memmove()?
题
当我无能为力/复制时,我需要治疗案件吗 memmove()
/memcpy()
作为边缘案例
int numberOfBytes = ...
if( numberOfBytes != 0 ) {
memmove( dest, source, numberOfBytes );
}
还是我应该在不检查的情况下调用该功能
int numberOfBytes = ...
memmove( dest, source, numberOfBytes );
以前的摘要中的支票需要吗?
解决方案
来自C99标准(7.21.1/2):
一个论点宣布为
size_t n
指定函数数组的长度,n
可以在调用该函数的调用中具有零值。除非在本节中对特定函数的描述中另有明确说明,否则该调用的指针参数仍然具有有效的值,如7.1.4中所述。在这样的调用中,一个定位角色发现没有出现的函数,比较两个字符序列的函数返回零,并且复制字符的函数复制了零字符。
所以答案是否定的;不需要检查(或是;您可以通过零)。
其他提示
正如 @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;
}
除了函数调用以外,您甚至不应该有任何性能的句子;如果编译器支持内在/插入此类功能,则附加检查甚至可能使代码变慢,因为该检查已经在此期间完成。
不隶属于 StackOverflow