You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过std::map修改结构体的成员变量?

问题分析

你当前代码无法更新原结构体的核心原因是:std::map<std::string, const char*>存储的是结构体成员指针的副本——也就是studentInfo->name和studentInfo->address这些指针本身的值。修改map中item.second的值,只会改变map内部条目的指针指向,和原结构体的成员变量没有任何关联,自然无法更新原结构体。

解决方案

要实现通过map修改结构体成员,需要让map存储指向结构体成员指针的指针(即const char**类型),这样就能直接操作原结构体的成员变量。

修正后的代码

typedef struct WWCryptoAuthorizationHeader
{
    int age;
    const char *name;
    const char *address;
} StudentInfo;

void foo(StudentInfo *studentInfo, const char* key)
{
    std::map<std::string, const char**> studentInfoMap;
    
    // 存储结构体成员指针的地址,而非指针的值
    studentInfoMap["name"] = &studentInfo->name;
    studentInfoMap["address"] = &studentInfo->address;

    // 查找目标key,比遍历更高效
    auto it = studentInfoMap.find(key);
    if (it != studentInfoMap.end())
    {
        // 解引用指针的指针,修改原结构体的成员
        *(it->second) = "John";
    }
}

关键说明

  1. map类型调整:将map的value类型改为const char**,这样存储的是结构体中const char*成员的内存地址,而非指针指向的字符串地址。
  2. 插入条目方式:用&studentInfo->name获取成员指针的地址存入map,建立map条目与原结构体成员的直接关联。
  3. 修改操作:找到目标条目后,通过*(it->second)解引用指针的指针,直接修改原结构体的成员指针指向,从而更新结构体内容。

注意:如果需要修改字符串的内容(而非指针指向),const char*类型是不允许的,因为const修饰了指向的内容不可修改。这种情况下应该改用char[]或std::string类型作为结构体成员。

内容的提问来源于stack exchange,提问作者mammoth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:22:13