我有一个非常奇怪的问题:
我正在读取一个xml文件,并将所有属性/值放在map<const char*, const char*> myMap
中作为键/值。
我的问题是我可以通过迭代器访问和打印所有键/值,但我无法直接访问(*mymap)["key"]
:程序在运行期间崩溃。
更奇怪的是:我可以添加一个已经在地图中的键,当我遍历地图并打印它时,我可以看到两个具有不同值的相同键!
我的猜测是我的xml文件可能有一个与通常的字符串格式略有不同的字符串格式,所以键看起来像字符串相同但它们可能不是二进制格式...
你对这个问题有任何想法吗?
答案 0 :(得分:1)
您正在使用指向char(而不是c-string)的指针作为键。而指针实际上是内存中的一个地址,所以当你执行
时(*mymap)["key"]
字符串文字“key”将作为四个元素的数组放置在堆栈顶部。由于您的密钥是pointe,因此第一个元素的地址将传递给操作符括号。这个值与您之前存储为键的内容没有任何共同之处,并且将为堆栈上的此指针创建一个新值,它将是一个空指针。
当您轻松比较c-strings
时会发生什么const char* a = "key"; // Something like 0xac22f214 <- address on the stack
const char* b = "key"; // 0xac22f218
a == b; // False
a < b; // True
a > b; // False
为了您的目的,最好使用std :: string并弄清楚指针是如何工作的。