Да, поведение вашего кода не определено. Однако, если вы используете if (memcmp(str1, str2, 3) == 0)
(обратите внимание, что количество байтов равно 3 вместо 4. Т.е. минимум два), поведение вашего кода будет приемлемым и правильным.
Поведение не определено, если доступ происходит после конца любого объекта, на который указывают lhs и rhs. Поведение не определено, если lhs или rhs является нулевым указателем.
В случае strcmp он останавливается, как только находит \0
. Однако для memcmp
ошибочное предположение, что memcmp сравнивает побайтово и не смотрит на байты за пределами первой точки различия. Функция memcmp не дает такой гарантии. Разрешается читать все байты из обоих буферов, прежде чем сообщать о результате сравнения.
Итак, я бы написал свой код так:
#include <stdio.h>
#include <string.h>
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
int main()
{
char str1[] = "abcd";
char str2[] = "ab";
int charsToCompare = MIN(strlen(str1), strlen(str2)) + 1;
if (memcmp(str1, str2, charsToCompare) == 0)
{
printf("equal string\n");
}
return 0;
}
Более подробную информацию и анализ по memcmp
можно найти здесь .