我可以调用“字节数”设置为零的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所述。 在这样的调用中,find字符的函数没有发生,比较两个字符序列的函数返回0,而复制字符的函数复制零个字符。
所以答案是否定的。 检查是没有必要的(或者是,你可以通过零)。
memmove
和memcpy
的文档说:
该函数不会检查源中的任何终止空字符 – 它始终复制完整的num个字节 。
opengroup 文档说基本上是一样的东西。
因此,假设它复制了“完全的num个字节”,当num = 0
时它将复制零个字节,因此不应该将其视为特殊情况。
正如@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; }
除了函数调用之外,你甚至不应该有任何性能问题; 如果编译器支持这些函数的内在函数/内联,那么额外的检查甚至可能使代码慢一点点,因为检查已经完成了。
不,检查是没有必要的。 依靠零处理是好的,非常合理,在我看来。 这可能值得评论。