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

时间:2013-09-26 17:32:54

标签: c memcmp

在阅读:How can I check that elements of an array are all same without using counter?时,@ Skizz使用了漂亮的解决方案:

memcmp (&string [0], &string [1], sizeof string [0] * (N - 1))

因此,如果N恰好是1,我们得到

memcmp (&string [0], &string [1], 0)

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


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

printf("%d\n", memcmp("foo", "bar", 0));

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

7.24.4.1 memcmp功能
概要

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

描述
memcmp函数比较s1指向的对象的前n个字符 s2指向的对象的前n个字符。

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


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

1 个答案:

答案 0 :(得分:12)

规范的相关部分实际上就是这个

  

7.21字符串处理

     

7.21.1字符串函数约定

     

2 声明为 size_t n 的参数指定的长度   对于函数的数组, n 在调用它时可以为零   功能。除非在a的描述中另有明确说明   本子条款中的特定功能,指针参数就是这样的   如7.1.4所述,呼叫仍应具有有效值。在这样的   call,一个找到一个字符的函数找不到,a   比较两个字符序列的函数返回零,和a   复制字符的函数复制零个字符。

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