memset()返回值的用途是什么?


89

memset()声明返回void*的值始终与传递给函数的地址相同。

返回值有什么用?为什么不返回void



2
返回值的用途是什么strcat()?有时,标准功能是它们被指定为的功能,而不是其应有的功能
DevSolar

4
@MatthieuM .:而且,退货通常会产生非零成本。即使返回值适合寄存器,您通常也需要将该值加载到寄存器中。这具有成本,但是很小。
NPE 2012年

15
@sharptooth:“杀死所有人”功能当然会返回被杀死的人数。
indiv 2012年

2
@MatthieuM:不必担心这种琐事,但当然可以。如果我正在为有限资源系统编写编译器怎么办?嗯?
Thomas Eding

Answers:


36

签名与所有其他类似的函数一致:memcpy()strcpy()等等。我一直认为这样做是为了使人们能够将对这些函数的调用链接起来,并在表达式中使用此类调用。

就是说,我从未遇到过逼迫以这种方式使用返回值的现实情况。


122

它可以用于呼叫链接,例如:

char a[200];
strcpy(memset(a, 0, 200), "bla");

9
是的,这绝对是“链接”用例。
Cartesius00 2012年

6
我赞成这个答案,因为这是一个有趣的案例。但是在现实生活中,我认为最好将memset和strcpy调用分开。
茨维尔托米尔·迪米特洛夫

26
C程序员喜欢无法读取的代码,因此在设计标准函数时必须允许无限链接。
Chad Schouggins

@ChadSchouggins阅读一些haskell代码,您就会知道c程序员实际上是逐字逐句的;)(正则表达式“ operator”的想法=〜)...
BitTickler 2015年

当然,在此示例中,反之亦然,strcpy使指针返回最后复制的指针会更有意义。memset(my_strcpy(a, "bla"), 0, a + 200);(像std::copy_nstd::fill_n用C做++)。
alfC

12

为了将该函数用作另一个函数的参数,例如 sprintf


1

我在谷歌搜索中看到了memset返回时遇到了这个问题。

我有一些代码在其中测试一个值,如果是,则测试是否为零。

因为C中没有完全可移植的方法来测试零,所以我必须在中间运行memset。

所以我的代码是:

if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )

这符合先前问题中列出的链接目的,但这是此技术的用法示例。

我将它留给其他人来判断这是否是好的编码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.