我可以调用“字节数”设置为零的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,而复制字符的函数复制零个字符。

所以答案是否定的。 检查是没有必要的(或者是,你可以通过零)。

memmovememcpy的文档说:

该函数不会检查源中的任何终止空字符 – 它始终复制完整的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; } 

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

不,检查是没有必要的。 依靠零处理是好的,非常合理,在我看来。 这可能值得评论。