memset() 函数的返回值有什么用处?

94

memset()被声明为返回void*,该值始终与传递到函数中的地址相同。

返回值的用途是什么? 为什么它不返回void


9
http://thevirtualmachinist.blogspot.co.uk/2010/08/whats-return-value-of-memset.html - BoBTFish
3
strcat() 的返回值有什么用?有时,标准函数不一定是该有的样子,而是它们被规定成了什么样子。 - DevSolar
4
通常情况下,返回值都与一定的成本相关。即使返回值适合寄存器,你仍然需要将该值加载到寄存器中。这样做虽然成本很小,但仍有一定代价。 - NPE
16
“杀死所有人”功能当然会返回被杀的人数。 - indiv
3
你不会担心这种琐事,但我可能会。如果我正在为有限资源系统编写编译器,怎么办?嗯? - Thomas Eding
显示剩余12条评论
4个回答

126

它可以用于调用链,例如:

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

9
没问题,这绝对是“链接”使用案例。 - Cartesius00
7
我已经给这个答案点赞了,因为它是一个有趣的案例。但在现实生活中,我认为最好将memset和strcpy调用分开处理。 - Tsvetomir Dimitrov
28
C程序员喜欢写难以阅读的代码,因此在设计标准函数时允许无限连接是必须的。 - Chad Schouggins
@ChadSchouggins 读一些Haskell代码,你会发现C程序员实际上是相当逐字的 ;)(想到正则表达式“运算符”=~)... - BitTickler
当然,在这个例子中,即使是另一种方式,让strcpy返回已复制内容的最后一个指针也更有意义。就像C++中的std::copy_nstd::fill_n一样,memset(my_strcpy(a, "bla"), 0, a + 200); - alfC

36

这个签名与所有其他类似的函数相一致:memcpy()strcpy()等。我一直认为这是为了使人们能够链接对这些函数的调用,并以表达式的方式使用这些调用。

尽管如此,我从未遇到过真实世界中需要我以这种方式使用返回值的情况。


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

3

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

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

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

所以我的代码是:

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

这涉及到前面问题中列出的链式用途,但这是使用此技术的示例。

我将让其他人评判这是否是良好的编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接