我可以调用memcpy()和memmove()并将“字节数”设置为零吗?

时间:2010-09-20 13:14:36

标签: c++ c pointers memcpy memmove

memmove() / memcpy()作为边缘情况时,我是否真的无法移动/复制时,是否需要处理案件

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

或者我应该在不检查

的情况下调用该函数
int numberOfBytes = ...
memmove( dest, source, numberOfBytes );

是否需要检查以前的代码?

2 个答案:

答案 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;
}

除了函数调用之外,你甚至不应该有任何性能问题;如果编译器支持这些函数的内在函数/内联,那么额外的检查甚至可能使代码变得微微一点,因为检查已经在那时完成了。