memcmp的返回值(ptr1,ptr2,0)?

chu*_*ica 5 c memcmp

在阅读中:如何不使用计数器的情况下检查数组的元素是否相同?,@ Skizz使用了漂亮的解决方案:

memcmp (&string [0], &string [1], sizeof string [0] * (N - 1))
Run Code Online (Sandbox Code Playgroud)

因此,如果N恰好为1,我们就会得到

memcmp (&string [0], &string [1], 0)
Run Code Online (Sandbox Code Playgroud)

当比较长度为0时,返回值是否确定为0?


测试用例(Cygwin gcc版本4.8.1 windows 64位)返回0.所以我知道这个和其他一些编译器/平台它是0.

printf("%d\n", memcmp("foo", "bar", 0));
Run Code Online (Sandbox Code Playgroud)

C11草案规范如下,但在问题上显得很安静.也许规范的另一部分或某事说了些什么?

7.24.4.1 memcmp函数
提要

#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);
Run Code Online (Sandbox Code Playgroud)

描述
memcmp函数将s1指向的对象的前n个字符与s2指向的对象的前n个字符进行比较.

返回
memcmp函数返回一个大于,等于或小于零的整数,因为s1指向的对象大于,等于或小于s2指向的对象.


(假设&string [1]没有引用非法内存)

AnT*_*AnT 12

规范的相关部分就是这个

7.21字符串处理

7.21.1字符串函数约定

2如果声明为size_t n的参数指定了函数数组的长度,则在调用该函数时,n的值可以为零.除非在本子条款中对特定函数的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如7.1.4中所述.在这样的调用中,定位字符的函数不会发生,比较两个字符序列的函数返回零,复制字符的函数复制零个字符.

这意味着memcmp当提供的序列长度为零时,保证返回零.

  • @koodawg:是的,我们是.它不是关于"字符串函数",而是关于"本子条款"(7.21)中描述的函数.并且`mem ...`函数确实在本子条款中描述.而且,7.21中描述的`mem ...`函数正式使它们成为"字符串函数". (2认同)
  • 7.24(在C11中)描述了所讨论的字符串处理函数,它们"对于操作字符类型*和其他被视为字符类型*的数组的对象很有用"(强调我的).所有`mem ...`函数都用"拷贝`n`字符","比较第一个'n`字符"等来描述,因为"bytes"和`char`s几乎是一样的东西在C. (2认同)