根据http://en.cppreference.com/w/cpp/string/byte/memcpy c ++的memcpy
有三个参数:目标,源和大小/字节。它还返回一个指针。为什么会这样?不是足以输入和复制数据的参数。
答案 0 :(得分:54)
如果某个函数没有特定的返回值,通常会返回一个输入参数(一个被视为 primary 的参数)。这样做允许您在表达式中使用“链式”函数调用。例如,你可以做
char buffer[1024];
strcat(strcpy(buffer, "Hello"), " World");
具体是因为strcpy
返回原始dst
值作为结果。基本上,在设计这样的函数时,您可能希望为“链接”选择最合适的参数并将其作为结果返回(再次,如果您还有其他要返回的,即否则您的函数将返回void
)。
memcpy
是另一个例子。可能的用例可能与类似
char *clone_buffer(const char *buffer, size_t size)
{
return memcpy(new char[size], buffer, size);
}
如果memcpy
没有返回目标缓冲区指针,我们可能必须实现上面的
char *clone_buffer(const char *buffer, size_t size)
{
char *clone = new char[size];
memcpy(clone, buffer, size);
return clone;
}
看起来“更长”。这两种实现之间的效率没有任何差别。并且可以说哪个版本更具可读性。还有很多人可能会欣赏“免费”的机会来编写如上所述的第一个版本的简洁单行。
人们常常发现memcpy
返回目标缓冲区指针会让人感到困惑,因为人们普遍认为从函数返回指针通常(或总是)表明函数可能会分配/重新分配内存。虽然这个可能确实表明了后者,但是没有这样的硬规则而且从来没有这样,所以经常表达的意见是返回指针(如memcpy
所做的那样)在某种程度上是“错误的”或“不良做法”完全没有根据。
答案 1 :(得分:10)
IIRC,在C的早期版本中,没有void
返回。因此,由于遗留原因,已经存在很长时间的库函数返回某些,这是他们能够提出的最好的。
string.h
中有许多函数返回目标参数:memcpy
,strcpy
,strcat
。它不是很有用,但它没有任何危害(可能在许多调用约定中甚至不需要执行指令)。
您可能会想到一个用途:char *nextbuf = memcpy(get_next_buf(), previous_buf+offset, previous_size-offset);
而不是char *nextbuf = get_next_buf(); memcpy(nextbuf, etc);
或其他东西。
为了进行比较,qsort
返回void。它可以被定义为返回base
的原则是“返回某些东西,它可能会派上用场”,但事实并非如此。 std::copy
更有用的是将迭代器返回到输出范围的 end 。对于非随机访问迭代器,可能不是微不足道的,甚至可能是调用者计算的。
答案 2 :(得分:1)
通过返回一个值,可以将memcpy函数的调用用作r值。
答案 3 :(得分:0)
如果您想要表明您没有使用它,您可以将返回值转换为空格 - 例如:
(void) memcpy(mydest, mysrc, mybytes);
答案 4 :(得分:0)
void* memcpy( void* dest, const void* src, std::size_t count );
returns void * which can be assigned to another void array that can be used as
int or char data type.
void * ret = new int[6];
ret = memcpy(newarr,arr,sizeof(int)* 5);