8

memcmp我已经使用该函数比较了两个字符串文字。

#include <stdio.h>
#include <string.h>

int main() 
{
  char str1[] = "abcd";
  char str2[] = "ab";

  if (memcmp(str1, str2, 4) == 0) 
  {
    printf("equal string\n");
  }
  return 0;
}

在上面的程序中,str2str1. 这意味着字符串str2被越界访问。

那么,这是未定义的行为吗?

4

2 回答 2

11

您的代码的行为未定义。C 标准不要求在memcmp知道结果后立即返回;也就是说,与语言支持的任何字符编码相比,它不一定要返回。该标准也没有指定进行词典比较的顺序(尽管从头开始实现会很棘手)。\0'c''c' == '\0'0

str2是一种char[3]类型。可能会尝试访问第 4 个元素。

参考:http ://en.cppreference.com/w/c/string/byte/memcmp

于 2018-05-02T07:22:17.547 回答
-2

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

于 2018-05-02T07:39:33.783 回答