当我尝试在我的 map (名为子项)中插入一个值时,会出现分段错误。我无法理解我的方法到底是什么问题(已注释和未注释的问题)。

struct trienode{
    map < char , struct trienode* > child;
    bool eow;
}; typedef struct trienode trienode;

void insert_trie(trienode* root,string mystr){

    int len = mystr.length();
    int p=0;
    char ch=mystr.at(p);
    trienode* temp=root;
    while(p<len){
        map<char, trienode* >::iterator itr=(temp->child).find(ch);

        if( itr!=(temp->child).end()){
            temp=itr->second;
            p++;
            ch=mystr.at(p);
        }
        else{
            trienode* temp2;
            temp2=(trienode*)malloc(sizeof(trienode));
            temp->child.insert(make_pair(ch,temp2));//segmentation fault occure on this line or line below it.
            //(temp->child)[ch]=temp2;
            if(p==len-1){
                temp2->eow=true;
            }
            else{
                temp2->eow= false;
                temp=temp2;
            }
            p++;
            ch=mystr.at(p);
        }
    }
}

最佳答案

您需要使用new,而不是malloc。否则,std::map不会被初始化。并且段错误可能发生在std::map的copy构造函数内部。

  • 您可以将std::map<char,trienode>用作child,并避免所有这些错误。
  • std::map::operator[]插入项,如果您确定trienode::eow初始化为false,则可以依靠它。
  • 10-07 14:26