当我无能为力/复制时,我需要治疗案件吗 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;
}

除了函数调用以外,您甚至不应该有任何性能的句子;如果编译器支持内在/插入此类功能,则附加检查甚至可能使代码变慢,因为该检查已经在此期间完成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top