当memmove()
/ memcpy()
作为边缘情况时,我是否真的无法移动/复制时,是否需要处理案件
int numberOfBytes = ...
if( numberOfBytes != 0 ) {
memmove( dest, source, numberOfBytes );
}
或者我应该在不检查
的情况下调用该函数int numberOfBytes = ...
memmove( dest, source, numberOfBytes );
是否需要检查以前的代码?
答案 0 :(得分:123)
根据C99标准(7.21.1 / 2):
声明为
size_t n
的参数指定a的数组长度 函数n
在调用该函数时可以为零。除非明确说明 否则在本子条款中的特定函数的描述中,指针参数 如此调用仍应具有有效值,如7.1.4所述。在这样的电话中,a 找到一个字符的函数找不到,一个比较两个的函数 字符序列返回零,复制字符的函数复制零 字符。
所以答案是否定的;检查是没有必要的(或者是;你可以传递零)。
答案 1 :(得分:3)
正如@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;
}
除了函数调用之外,你甚至不应该有任何性能问题;如果编译器支持这些函数的内在函数/内联,那么额外的检查甚至可能使代码变得微微一点,因为检查已经在那时完成了。