当值是地址C 时,如何使用键使用映射值

how to use map value by key when the value is an address C++

本文关键字:何使用 映射 地址      更新时间:2023-10-16

我使用地图获取另一个文件中的全球地址我的功能是外部" 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 ::字符串作为键。