В чтении: How can I check that elements of an array are all same without using counter?, @Skizz использует изящное решение:Возвращаемое значение memcmp (ptr1, ptr2, 0)?
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 окна 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, чтобы первые п символов объекта, на который указывает s2.
Возвращает
Функция memcmp возвращает целое число, большее, равно или меньше нуля, соответственно, как объект, на который указывает s1 больше, чем, равна или меньше, чем объект , на который указывает s2 ,
(Предположим & строку [1] не ссылаться на нелегальную память)
Если 1 == N, тогда не делайте этого. –
'memcmp' не является надежным для сравнения двух объектов для одного и того же значения, если объекты могут содержать байты заполнения, биты заполнения или множественные кодировки одного значения (например, положительный нуль и отрицательный ноль). –
@koodawg: Почему бы и нет? –