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)
在这种情况下,您不可能出现误报。
使用常规 == 与 strcmp 比较该值是否安全?
不。从某种意义上说,这是不安全的,两个字符串文字(即使具有相同的内容)也不能保证具有相同的存储地址,因此可能比较不同。
您可以首先比较地址,然后仅在地址不同时比较内容。如果地址相符,您可以提前返回。