【问题标题】:error using pointers in functions c++在函数c ++中使用指针时出错
【发布时间】:2015-07-24 13:08:14
【问题描述】:
#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&lt;&lt; (*prev).a 正在打印其他一些字符。我犯了什么错误?

【问题讨论】:

  • 预期输出是什么,你得到什么输出?
  • 它必须打印“helloworl”和“tllothis”的字符,每个字符都带有换行符,但它正在打印一些垃圾值。
  • typedef struct node { ... } node; 非常喜欢 C。在 C++ 中,您可以简单地使用 struct node { ... };,因为 node 可以在没有 typedef 的情况下使用。
  • @crashmstr typedef struct 废话让我发疯,多么糟糕的解决方案。

标签: c++ pointers dictionary


【解决方案1】:

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

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

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

离开这个块后,指针变得无效,你会得到随机错误。您应该通过运算符 new 创建节点,最好在地图中使用智能指针,或者按值保留节点。

【讨论】:

    【解决方案2】:
    (...)
    node pt;
    pt.a = s[i];
    ((*prev).b)[s[i]] = &pt;
    prev = &pt;
    (...)
    

    在您的 add 函数中,您正在创建一个本地 node 并将其地址传递到映射的条目中,然后使其成为 prev 节点。一旦变量超出范围,它就会被删除,并且您的 prev 节点指向无效地址。所以下次你打印prev任何事情都可能发生,因为它是未定义的行为。

    【讨论】:

    • 是的,我也是这么想的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多