在函数c ++中使用指针时出错

时间:2015-07-24 13:08:15

标签: c++ pointers dictionary

#include <iostream>
using namespace std;
#include <string>
#include <map>

typedef struct node{
    char a;
    map<char , node*> b;
}node;

node a[26] ; 

void add(string s){
    node *prev = &(a[s[0]-'a']);
    int i = 0;
    int len = s.length();
    for(i = 1; i < len; ++i){        
        map<char,node*>::iterator it = ((*prev).b).find(s[i]);
        if(it != ((*prev).b).end()){
            prev = it->second;
        }
        else{
            cout << (*prev).a << endl;
            node pt;
            pt.a = s[i];
            ((*prev).b)[s[i]] = &pt;
            prev = &pt;
        }
    }
}

int main(){
    string s = "helloworld";
    string t = "htllothis";
    int i = 0 ;
    for(i = 0;i < 26;++i){
        a[i].a = 'a'+i;
    }
    add(s);
    add(t);
    return 0;
}

我正在尝试使用map和char实现轮胎数据结构,但cout<< (*prev).a正在打印其他一些字符。我做错了什么?

2 个答案:

答案 0 :(得分:4)

首先(*prev).b相当于prev->b,我不明白你为什么使用->作为迭代器而不是这个指针,很难读取你的代码。

将指向本地对象的指针插入地图的主要问题:

       cout << (*prev).a << endl;
       node pt;
       pt.a = s[i];
       ((*prev).b)[s[i]] = &pt;
       prev = &pt;

离开此块后,指针变为无效,并且您会收到随机错误。您应该按运算符new创建节点,并在地图中更好地使用智能指针,或者按值保留节点。

答案 1 :(得分:0)

(...)
node pt;
pt.a = s[i];
((*prev).b)[s[i]] = &pt;
prev = &pt;
(...)

add功能中,您创建本地node并将其地址传递到地图的条目中,然后将其设为prev节点。一旦变量超出范围,它就会被删除,并且您的prev节点指向无效的地址。因此,下次打印prev时,任何事情都可能发生,因为它是未定义的行为。