我想知道memcmp必须返回什么函数。
我一直在互联网上搜索,通常情况下,memcmp定义如下所示:
函数返回大于、等于或小于零的整数,因为s1指向的对象大于、等于或小于s2指向的对象。
从来没有明确地说过,确切地返回了什么():是两个字节值之间的差异,还是-1、0或1?我很困惑:
memcmp时,它返回-1、0或1,即使计算出的两个字节之间的差值大于1或小于-1。memcmp的函数时,它们几乎都返回两个字节之间的差额,作为int,而不是返回-1、0或1。由于我无法得到函数memcmp的足够精确的定义,所以我在这里问这个问题:函数memcmp到底应该返回什么?某个地方有“官方”源代码吗?(我见过很多memcmp源代码,但没有人给我一个答案:我假设它们不是写在库字符串中的函数.h,至少不在我的计算机上.)
发布于 2017-07-07 16:02:25
标准没有指定memcmp()返回的特定值。C11草案标准在第7.24.4条1中确实说过
比较函数memcmp、strcmp和strncmp返回的非零值的符号由所比较对象中不同的第一对字符(都解释为无符号字符)的值之间的差异符号决定。
因此,只有来自比较函数的非零返回值的符号才是有意义的。这里给出的空间允许每个实现根据它认为合适的情况解释这些需求。
另外,请注意,没有“正式源代码”;标准是C实现必须遵守的文档。即使阅读用于查找用于生成memcmp()返回值的底层方法的实现的源代码,在代码中使用这些值充其量也是不可移植的,并且很容易受到该实现中未来更改的影响。
发布于 2017-07-07 16:14:36
未指定确切结果的原因是
首先,确切的结果并不重要。调用者只需要知道三个结果中的一个-- <、=或>。定义的行为起作用。现在规范可以说返回- 1,0,或者1。那么为什么不说这一点很重要呢?见第二点
第二。通过不指定确切的结果,实现者可以编写非常高效的代码。memcmp可以通过数位或做一些聪明的操作来实现。或。非自然产生1或-1的异或等。因此,规范对确切的返回值保持沉默。
发布于 2017-07-07 15:59:59
正如@EugeneSh所说,它没有定义。POSIX规范说,除了你引用的部分:
非零返回值的符号应由所比较对象中不同的第一对字节(都解释为类型无符号字符)的值之间的差异符号来确定。
因此,只有零/非零和正/负是适用于来自memcmp的返回值的有意义的测试。不要依赖于实际值,因为它们可能在不同的C库(甚至处理器体系结构)之间存在差异。
源例
我在GitHub上找到了GNU库(glibc)的镜像。memcmp接受两个字节之间的差异(第332行),因此返回值通常不只是-1或+1。然而,一个特定的库可能实现memcmp,但是对目标平台来说最有意义。
https://stackoverflow.com/questions/44975110
复制相似问题