是的,您的代码行为未定义。但是,只要您正在使用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
可以在这里找到。