5

我正在使用 C++ 映射在我的程序中实现字典。我的函数获取一个结构作为参数,并且应该返回基于structure.name成员的关联值 is char named[32]。以下代码演示了我的问题:

map <const char *, const char *> myMap;
myMap.insert(pair<const char *, const char *>("test", "myTest"));

char *p = "test";
char buf[5] = {'\0'};
strcpy(buf, "test");

cout << myMap.find(p)->second << endl; // WORKS
cout << myMap.find("test")->second << endl; // WORKS
cout << myMap.find(buf)->second << endl; // DOES NOT WORK

我不确定为什么第三种情况不起作用,我应该怎么做才能使它起作用。我调试了上面的代码来观察传递的值,但我仍然无法解决问题。

谢谢!

4

4 回答 4

9

map定位元素将执行指针比较,而不是字符串比较。前两个有效,因为"test"是字符串文字并且将具有相同的地址。最后一个不起作用,因为buf它的地址与"test".

要解决此问题,请使用 astd::string或为char*.

于 2012-04-05T20:45:59.560 回答
5

映射键是一个指针,而不是一个值。你所有的文字“测试”字符串共享存储,因为编译器很聪明,所以它们的指针是相同的,但是buf是不同的内存地址。

您需要使用具有值相等语义的映射键,例如std::string, 而不是char*.

于 2012-04-05T20:46:03.040 回答
1

就像提到的那样,您正在比较地址而不是值。我想链接这篇文章:

c++ 中的字符串文字是在静态内存中创建的吗?

由于所有文字都具有相同的地址,这解释了为什么即使基础类型仍然是 a ,您对字符串文字的比较仍然有效const char *(但取决于编译器,它可能并不总是如此)

于 2012-04-05T20:55:50.273 回答
0

这是因为通过 buf[5],您正在分配 buf 指向的内存,但是当您使用“p”指针时,它指向的内存位置与 map 使用的内存位置相同。所以总是在键中使用 std::string 而不是指针变量。

于 2013-04-15T20:57:30.220 回答