我遇到了一个奇怪的错误
我返回一个指针,在返回之前,我确认指针有效&有记忆 但是,在函数作用域之后,当我尝试使用main()中的返回值时,它变为NULL。 我还尝试返回指针的解除引用值,返回前是修改后的结构,main()中是未修改的结构。
这应该像字典
#include <iostream>
#include <fstream>
#include <string>
#include "trie.h"
using namespace std;
int alphaLoc(char segment){
return (int)segment - 97;
}
//inserts a word in the tree
void insert(TrieNode &node, const std::string &word){
int locationInAlphabet = alphaLoc(word[0]);
if (node.letters[locationInAlphabet] == NULL){
node.letters[locationInAlphabet] = new TrieNode;
}
if (word.length() == 1){
if (node.letters[locationInAlphabet]->isWord == true){
cout<<"Word Already Exsit"<<endl;
}
node.letters[locationInAlphabet]->isWord = true;
}
else{
insert(*(node.letters[locationInAlphabet]), word.substr(1,word.length()-1));
}
}
//returns the node that represents the end of the word
TrieNode* getNode(const TrieNode &node, const std::string &word){
int locationInAlphabet = alphaLoc(word[0]);
if (node.letters[locationInAlphabet] == NULL){
return NULL;
}
else{
if (word.length() == 1){
return (node.letters[locationInAlphabet]);
}
else{
getNode(*(node.letters[locationInAlphabet]), word.substr(1,word.length()-1));
}
}
}
int main(){
TrieNode testTrie;
insert(testTrie, "abc");
cout<< testTrie.letters[0]->letters[1]->letters[2]->isWord<<endl;
cout<<"testing output"<<endl;
cout<< getNode(testTrie, "abc")->isWord << endl;
return 1;
}
输出是:
1
testing output
Segmentation fault: 11
trie.h:
#include <string>
struct TrieNode {
enum { Apostrophe = 26, NumChars = 27 };
bool isWord;
TrieNode *letters[NumChars];
TrieNode() {
isWord = false;
for ( int i = 0; i < NumChars; i += 1 ) {
letters[i] = NULL;
} // for
}
}; // TrieNode
void insert( TrieNode &node, const std::string &word );
void remove( TrieNode &node, const std::string &word );
std::string find( const TrieNode &node, const std::string &word );
答案 0 :(得分:3)
return
之前您遗失了getNode(*(node...
。
如果此行在某个时刻执行,则在此执行控制流到达getNode
函数的末尾之后,此处没有return
语句。它将导致未定义的返回值,这总是很糟糕。你必须总是从你的功能中返回一些明确的东西。