当 p 指向一个字符时,strcmp(p, "\n") 是未定义的行为吗?

Is strcmp(p, "\n") undefined behavior when p points to a character?

检查最小值:

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

int main(void) {
    char newline = '\n';
    char* p = &newline;
    if(strcmp(p, "\n") == 0) {
        printf("ok\n");
    } else {
        printf("wrong\n");
    }
    return 0;
}

这是未定义的行为吗?或者它只是错误的(即它总是 return 不相等)?不管是什么,请解释原因!

它是 UB 的原因很简单,p 不是空终止字符串,strcmp 如果输入非空终止字符串是 UB。

是的,它将是未定义的。

strcmp 需要两个字符序列;每个 终止 [=11=].

p 不满足。 "\n" 确实如此。

它是未定义的,所以所有的赌注都不成立,但除非你有一个非常奇特的 C 实现,否则结果可能取决于内存中 char 后面发生的任何事情。

你可以像这样做你想做的事:

strncmp(p, "\n", 1) == 0

或者,确实,像这样:

p[0] == '\n'

strcmp(p1,p2) 的行为仅在 p1 标识包含零字节的可访问内存范围的开始的情况下定义,p2 也是如此。

的行为
int foo(int bar)
{
  char b=bar;
  return strcmp(&b, "Moo");
}

将在 'bar' 为零(空字符串 将需要比较小于非空字符串文字)但是 在所有其他情况下未定义。如果代码是:

int foo(int bar, int boz)
{
  char arr[2];
  arr[0] = bar; arr[1] = boz;
  return strcmp(arr, "Moo");
}

那么在 bar 或 boz 为零的所有情况下都会定义行为, 但不是在两者都持有非零值的情况下。