当值是地址C 时,如何使用键使用映射值
how to use map value by key when the value is an address C++
我使用地图获取另一个文件中的全球地址我的功能是外部" C"
const map< const char*, void*> GlobalVars = {
{ "A", &A },
{ "B", &B },
{ "C", &C },
{ "D", &D }
};
extern "C" void GetAddrByName(const char * str)
{
auto it2 = GlobalVars.at(str);//this return garbedge
return;
}
我不明白为什么我不正确获得地址并得到垃圾,当我将这一行 auto it = GlobalVars.at("A");
放置时,一切正常。
该地图将无法正常工作,因为它将比较指针值而不是字符串内容。因此,除非输入密钥实际上指向您在地图初始化期间使用的精确const char*
,否则它将找不到键。
如果您想在这种情况下使用const char*
作为地图的键(而不是切换到使用std::string
(,则需要为地图提供比较器,以便执行实际的字符串比较。
例如:
struct cmp_str {
bool operator()(const char* a, const char* b) const {
return strcmp(a, b) < 0;
}
};
const map< const char*, void*, cmp_str> GlobalVars = {
{ "A", &A },
{ "B", &B },
{ "C", &C },
{ "D", &D }
};
请记住,该地图可能是危险的,因为比较器正在提出指针。因此,您需要确保没有悬挂的指针最终以钥匙而结束,否则您将获得UB。但是,以您使用的方式(将字符串文字作为键和const映射(应该是安全的。
,因为您传递给GlobalVars.at("A")
的密钥是地址是与您在地图初始化过程中传递的位置不同的位置。实际上,问题与指针值无关。
例如,对于代码中的const char *a1 = "A";
和const char *a2 = "A";
,则a1
不等于a2
,因为它们指向不同的存储位置(取决于编译器(。因此,char *
在这里不能用作地图密钥!使用std ::字符串作为键。
相关文章:
- 在类中使用映射并通过其他类的 get() 和 set() 函数访问值
- 为什么此代码在此 Trie 实现中使用映射 c++ 中的指针崩溃?
- 当值是地址C 时,如何使用键使用映射值
- C++ 使用映射中的参数调用函数
- C++ - 使用映射存储回调函数
- 使用映射<字符串,结构>类型的映射编译头文件时出错
- 如何在程序中声明/定义一次并在两个类中使用映射列表
- 在 STL 中使用映射获取编译错误C++
- C++-如果我使用映射,我的对象会被删除两次吗
- 我想使用C++映射,以存储一个矩形id的4个坐标,任何人都可以举一个例子吗
- 如何使用C / C++映射Modbus寄存器地址
- 在C++中使用映射而不是数组来保护在数组边界之外的搜索
- C++:使用映射作为另一个映射的值
- 使用映射 c++ 查找矢量的多种模式
- 如何使用映射值
- 在映射容器中使用映射值重载<<运算符
- 在C++中使用映射的值的组合
- 使用映射时出现错误C2664
- 如何使用映射通过指向函数的指针来构造对象
- 使用映射迭代器编译错误