8

在阅读中:如何在不使用计数器的情况下检查数组的元素是否都相同?, @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 指向的对象。


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

4

1 回答 1

14

规范的相关部分真的是这个

7.21 字符串处理

7.21.1 字符串函数约定

2当声明为size_t n的参数指定函数数组的长度时,在调用该函数时,n的值可以为零。除非在本小节中对特定函数的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如 7.1.4 中所述。在这样的调用中,定位字符的函数找不到任何出现,比较两个字符序列的函数返回零,复制字符的函数复制零字符。

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

于 2013-09-26T18:01:36.453 回答