C++ 向trie添加单词

C++ 向trie添加单词,c++,trie,C++,Trie,我正在创建一个trie,在编译时遇到了问题 我得到的警告是: 从“currNode->dict”读取无效数据:可读大小为“104”字节,但可以读取“388”字节 #pragma一次 #包括 #包括 #包括 使用名称空间std; 常数int SIZE=26; 结构节点{ 布尔语; 节点*dict[大小]; }; 类词典 { 公众: 字典(); 字典(字符串文件); void addWord(字符串字); 私人: 节点*根; 国际货币基金组织; }; 字典::字典() { numWords=0; 根

我正在创建一个trie,在编译时遇到了问题

我得到的警告是: 从“currNode->dict”读取无效数据:可读大小为“104”字节,但可以读取“388”字节

#pragma一次
#包括
#包括
#包括
使用名称空间std;
常数int SIZE=26;
结构节点{
布尔语;
节点*dict[大小];
};
类词典
{
公众:
字典();
字典(字符串文件);
void addWord(字符串字);
私人:
节点*根;
国际货币基金组织;
};
字典::字典()
{
numWords=0;
根=新节点;
对于(int i=0;idict[i]=nullptr;
}
字典::字典(字符串文件)
{
numWords=0;
根=新节点;
对于(int i=0;idict[i]=nullptr;
河流充填;
字符串字;
inFile.open(文件);
while(内嵌>>word){
addWord(word);
numWords++;
}
}
void Dictionary::addWord(字符串词)
{
int len=word.length();//单词大小
字符字母;
int pos;
节点*currNode=根节点;
对于(int i=0;idict[pos]){
currNode->dict[pos]=新节点;
currNode->isWord=false;
}
currNode=currNode->dict[pos];
}
currNode->isWord=true;
}

这可能是什么原因造成的?我很确定我没有试图访问无效内存。也许这是我设置节点和类的方式?

一个错误是无法将
节点
初始化为默认值。在
字典
默认构造函数中,您拥有的代码实际上应该是
节点
应该做的事情的一部分:

root = new Node ;
for (int i = 0; i < SIZE; i++)
    root->dict[i] = nullptr;
所以每次你这样做:

if (!currNode->dict[pos]) {
    currNode->dict[pos] = new Node;
您正在创建未初始化的
节点
对象。整个
节点::dict
数组包含未初始化的指针,稍后您将尝试访问这些指针

最简单的解决方案是零初始化
节点
对象

if (!currNode->dict[pos]) {
    currNode->dict[pos] = new Node(); // <-- Note the parentheses

这样,即使是
新节点将创建已初始化的节点。

我很确定我没有试图访问无效内存——请发布一条消息。我们不知道这些代码在何处、何时或如何发挥作用。这是错误/警告吗?您还可以指定在什么时候得到这个吗?
pos=字母-'a'--如果
pos
结果为负值怎么办?或者一般来说,如果执行此操作时,
pos
无效该怎么办:
currende->dict[pos]
?对于此分配,我只添加小写的单词。根据ASCII,“a”之后的所有字母都是更高的整数,所以我相信不能得到负数。@ThrmsNPrfs——我只添加小写的单词——这并不意味着你只假设字符是有效的。如果不是呢?我没有看到包含所有小写数据的
main
程序。教训是永远不要编写一个程序,它是如此开放的漏洞发生。
if (!currNode->dict[pos]) {
    currNode->dict[pos] = new Node;
if (!currNode->dict[pos]) {
    currNode->dict[pos] = new Node(); // <-- Note the parentheses
   #include <algorithm>

   struct Node {
        bool isWord;
        Node* dict[SIZE];
        Node() : isWord(false) { std::fill_n(dict, SIZE, nullptr); }
    };