在阅读: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]没有引用非法内存)
答案 0 :(得分:12)
规范的相关部分实际上就是这个
7.21字符串处理
7.21.1字符串函数约定
2 声明为 size_t n 的参数指定的长度 对于函数的数组, n 在调用它时可以为零 功能。除非在a的描述中另有明确说明 本子条款中的特定功能,指针参数就是这样的 如7.1.4所述,呼叫仍应具有有效值。在这样的 call,一个找到一个字符的函数找不到,a 比较两个字符序列的函数返回零,和a 复制字符的函数复制零个字符。
这意味着当提供的序列长度为零时,memcmp
保证返回零。