广东建设安全质量协会网站,网站多国语言设计,学网站开发应该学什么软件,建设wap手机网站今天在公司的时候#xff0c;排查一个问题#xff0c;创建l3 lif 失败#xff0c;查看各种日志发现是用key去创建的 lif失败了#xff0c;日志里指示key为空#xff0c;导致的创建失败。原因为一个结构体比基线的多了一些东西#xff0c;导致版本不对#xff0c;既而计算… 今天在公司的时候排查一个问题创建l3 lif 失败查看各种日志发现是用key去创建的 lif失败了日志里指示key为空导致的创建失败。原因为一个结构体比基线的多了一些东西导致版本不对既而计算出来的key不对。调试过程中用到了 ptype 打印结构体变量的类型结果看基线分支代码却对应不上比基线代码的结构体多了一个 union 变量。以下只作一下练习
#include map
#include string
#include stdlib.h
#include stdio.henum
{TYPE_ID_0,TYPE_ID_1,TYPE_ID_2,TYPE_ID_3,TYPE_ID_4,TYPE_ID_5,TYPE_ID_6,TYPE_ID_MAX
};
typedef struct mapData
{int id;char *p;std::string key;
}MapData;std::mapstd::string, MapData g_mapData[TYPE_ID_MAX];int changeMap(int type);
int main()
{changeMap(2);for(int i 0 ; i TYPE_ID_MAX; i){auto data g_mapData[i];//for(auto it : data)for(auto ite data.begin(); ite ! data.end(); ite){//printf(i %d, string: %s, id %d, key %s\n, i, it.first.c_str(), it.second.id, it.second.key.c_str());printf(i %d, string: %s, id %d, key %s\n, i, ite-first.c_str(), ite-second.id, ite-second.key.c_str());}}return 0;
}int changeMap(int type)
{int a 100;auto data g_mapData[type];char test[] test;MapData newData {20, test, 2000};data[1] newData;data.insert(std::pairstd::string, MapData(2, newData));return 0;
}
用GDB调试打一个断点 我们可以看到如果是结构体类型则会打印出来结构体的成员如果是map类型会打印出什么呢 如果要改变变量的值可以使用命令 set variable xxxx如 如果是结构体类型该怎么赋值呢先看一下最简单的结构里就一个基本的类型
#include map
#include string
#include stdlib.h
#include stdio.henum
{TYPE_ID_0,TYPE_ID_1,TYPE_ID_2,TYPE_ID_3,TYPE_ID_4,TYPE_ID_5,TYPE_ID_6,TYPE_ID_MAX
};
typedef struct mapData
{int id;
}MapData;std::mapstd::string, MapData g_mapData[TYPE_ID_MAX];int changeMap(int type);
int main()
{changeMap(2);for(int i 0 ; i TYPE_ID_MAX; i){auto data g_mapData[i];//for(auto it : data)for(auto ite data.begin(); ite ! data.end(); ite){//printf(i %d, string: %s, id %d, key %s\n, i, it.first.c_str(), it.second.id, it.second.key.c_str());//printf(i %d, string: %s, id %d, key %s\n, i, ite-first.c_str(), ite-second.id, ite-second.key.c_str());}}return 0;
}int changeMap(int type)
{int a 100;auto data g_mapData[type];char test[] test;MapData newData {20};data[1] newData;data.insert(std::pairstd::string, MapData(2, newData));return 0;
}
打个断点查看一下结构体的值然后再修改一下看结果
如果是复杂的结构体呢如
typedef struct mapData
{int id;char *p;std::string key;
}MapData; 结构体里有指针有std::string 类型这时候该怎么赋值呢 结果有点不一样即使第二个成员是指针我们临时给它赋了一个值也是正常的但std::string却显示为空为何我们看一下std::string 的源码
string 保存的是一个指针指针指向的才是真正的数据那我们可以看一下这个指针指向的地址是不是保存着我们给它赋的值 “aaa” 首先打印出key的地址再根据它的地址看内存里保存了哪些值其中 0x00607060 就是std::string 私有成员 _M_dataplus的值因为它是一个指针指向的是string 的内容。但为何在GDB里直接打印结构体却显示为空呢有知道的大神指点一下。