2013-09-26 3 views
5

В чтении: 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] не ссылаться на нелегальную память)

+0

Если 1 == N, тогда не делайте этого. –

+0

'memcmp' не является надежным для сравнения двух объектов для одного и того же значения, если объекты могут содержать байты заполнения, биты заполнения или множественные кодировки одного значения (например, положительный нуль и отрицательный ноль). –

+0

@koodawg: Почему бы и нет? –

ответ

10

Соответствующая часть спецификации действительно это один

7,21 обработки Строка

7.21.1. Стандартные условные обозначения

- Где аргумент объявлен как size_t п определяет длину массива для функции, п может иметь нулевое значение на вызов этой функции . Если явно не указано иначе в описании конкретной функции в этом подпункте, аргументы указателя на такой вызов все равно должны иметь допустимые значения, как описано в 7.1.4. При таком вызове функция, которая находит символ, не находит никакого вхождения, функция , которая сравнивает две последовательности символов, возвращает ноль и функцию , которая копирует символы, копирует нулевые символы.

Это значит, что memcmp гарантирует возврат нуля, если длина прилагаемой последовательности равна нулю.

+0

Выглядит хорошо. То же самое в _C11 draft 7.24.1 2_. Я полагаю, что ваша ссылка от C99? – chux

+0

@chux: Да, C99. – AnT

+1

Мы уверены, что memcmp попадает в 7.21 Обработка строк? Очевидно, это не технически строковая функция. –

Смежные вопросы