在 C/C++ 中比较 const char* 与 == 是否安全?

Dav*_*nan 3 c c++ char-pointer

假设我有一个使用以下方式跟踪类型的结构const char*

struct Foo {
  const char* type;
}
Run Code Online (Sandbox Code Playgroud)

假设我在整个程序中仅使用字符串文字分配此值:

Foo bar;
bar.type = "TypeA";

Foo baz;
baz.type = "TypeB";
Run Code Online (Sandbox Code Playgroud)

==使用常规值而不是 来比较该值是否安全strcmp

if (bar.type == baz.type) {
  printf("Same\n");
} else {
  printf("Different\n");
}
Run Code Online (Sandbox Code Playgroud)

出于性能原因我想这样做。

pmg*_*pmg 10

有3种情况可能发生

指针指向内存中的同一空间

bar.type = "foobar"; // `bar.type` holds `0xdeadbeef` which holds `"foobar"`
baz.type = "foobar"; // `baz.type` holds `0xdeadbeef` which holds `"foobar"`
if (bar.type == baz.type) { /* true positive */ }
Run Code Online (Sandbox Code Playgroud)

指针指向内存中不同的地方,但内存内容是相同的

bar.type = "foobar"; // `bar.type` holds `0xdeadbeef` which holds `"foobar"`
baz.type = "foobar"; // `baz.type` holds `0xdeadc0ff` which holds `"foobar"`
if (bar.type == baz.type) { /* false negative */ }
Run Code Online (Sandbox Code Playgroud)

指针指向不同的内存区域,这些区域有不同的内容

bar.type = "foobar"; // `bar.type` holds `0xdeadbeef` which holds `"foobar"`
baz.type = "bar"; // `baz.type` holds `0xdeadbef2` which holds `"bar"`
if (bar.type == baz.type) { /* true negative */ }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您不可能出现误报。


eer*_*ika 8

使用常规 == 与 strcmp 比较该值是否安全?

不。从某种意义上说,这是不安全的,两个字符串文字(即使具有相同的内容)也不能保证具有相同的存储地址,因此可能比较不同。

您可以首先比较地址,然后仅在地址不同时比较内容。如果地址相符,您可以提前返回。

  • @DavidCallanan 在单个翻译单元内,它很可能是相同的地址。在共享库之间,它可能不太可能是相同的地址。 (4认同)