使用memcmp比较两个字符串文字

msc*_*msc 8 c string-literals undefined-behavior memcmp language-lawyer

我使用该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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的程序中,str2比较短str1.这意味着str2访问字符串超出范围.

那么,这是不确定的行为吗?

Bat*_*eba 11

代码的行为未定义.memcmp一旦知道结果,C标准就不要求退货; 这是它并不一定必须在返回\0时相比'c',尽管价值'c' == '\0'0由语言支持的任何字符编码.该标准也没有规定字典比较的顺序(尽管从一开始就不开始实施).

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

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

  • @StoryTeller库不需要通过char指针访问内存.只要剩余序列足够宽并且正确对齐,并且只有错误对齐的第一个字节,并且最后不符合此大小的字节,则库更有可能被设计为以34或64位宽度访问存储器.比较单字节粒度.在这个例子中,很可能将存储器与一个32位比较进行比较. (4认同)
  • 在询问未定义的行为时,期待最糟糕的库,编译器和机器架构,当然,最愚蠢的实现:) (3认同)
  • @StoryTeller:我想知道随着并行化的使用越来越多,未来的实现是否可以通过提前读取来获得收益. (2认同)