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

如何基于用户输入向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:01:37