如何基于用户输入向stl::map插入键值对并查找元素?代码崩溃排查
问题分析与修复:stl::map插入后查找崩溃
嘿,我一眼就揪出问题根源了——你代码里的char* v是个未初始化的野指针!
当你执行cin >> v时,程序会尝试把输入的字符串写入这个指针指向的内存,但这个指针根本没指向任何有效的内存空间。这种操作属于「未定义行为」:有时候插入完显示元素看似正常,只是运气好没立刻触发崩溃,但内存已经被悄悄破坏了。等到后面执行查找逻辑时,之前的内存错误彻底爆发,直接导致程序崩溃。
最简单的修复方案:改用std::string
C++里处理字符串首选std::string,它会自动帮你管理内存,完全避免野指针、内存溢出这类麻烦问题。修改后的代码如下:
#include<iostream> #include<map> #include<utility> #include<string> // 别忘了添加string头文件 using namespace std; int main() { int n, k, q; string v; // 把char*换成std::string map<int, string> m1; // map的value类型同步改为string map<int, string>::iterator it; cout << "enter number of elements\n"; cin >> n; cout << "enter number and string- \n"; for(int i=0; i<n; i++) { cin >> k; cin >> v; m1.insert(pair<int, string>(k, v)); // pair的类型也对应修改 // 也可以用更简洁的写法:m1.emplace(k, v); } cout << "elements are- " << endl; for (it=m1.begin(); it!=m1.end(); it++) cout << it->first << " " << it->second << "\n"; cout << "enter a key to find element\n"; cin >> q; it = m1.find(q); if(it!=m1.end()) cout << it->first << " " << it->second ; else cout << "key was not found\n"; return 0; }
如果你非要用C风格字符串(不推荐)
如果因为特殊需求必须使用char*,那你得先给指针分配足够的内存,比如:
char* v = new char[100]; // 分配能存储100个字符的内存空间 // 使用完后一定要记得释放内存:delete[] v;
但这种方式很容易出现内存泄漏、缓冲区溢出的问题,所以还是强烈建议优先使用std::string。
内容的提问来源于stack exchange,提问作者Jay S
相关产品推荐
相关产品推荐

