- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习哈佛大学的 CS50 pset5,其中您的任务是将字典上传到您选择的数据结构中,然后对给定文本进行拼写检查。
这次我决定使用 trie,它的拼写检查正确,没有内存泄漏。
但是,运行 valgrind -v ./speller texts/lalaland.txt
似乎从上下文中返回 9 个错误。
鉴于没有内存泄漏,我似乎无法弄清楚这里到底是什么问题。
==5897==
==5897== HEAP SUMMARY:
==5897== in use at exit: 0 bytes in 0 blocks
==5897== total heap usage: 367,084 allocs, 367,084 frees, 82,227,504 bytes allocated
==5897==
==5897== All heap blocks were freed -- no leaks are possible
==5897==
==5897== ERROR SUMMARY: 9913647 errors from 9 contexts (suppressed: 0 from 0)
==5897==
==5897== 1 errors in context 1 of 9:
==5897== Conditional jump or move depends on uninitialised value(s)
==5897== at 0x422434: unload_node (dictionary2.c:28)
==5897== by 0x42362C: unload (dictionary2.c:170)
==5897== by 0x421564: main (speller.c:152)
==5897== Uninitialised value was created by a heap allocation
==5897== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5897== by 0x422E91: load (dictionary2.c:104)
==5897== by 0x420992: main (speller.c:40)
==5897==
==5897==
==5897== 216 errors in context 2 of 9:
==5897== Conditional jump or move depends on uninitialised value(s)
==5897== at 0x422B80: check (dictionary2.c:73)
==5897== by 0x421363: main (speller.c:112)
==5897== Uninitialised value was created by a heap allocation
==5897== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5897== by 0x423216: load (dictionary2.c:131)
==5897== by 0x420992: main (speller.c:40)
==5897==
==5897==
==5897== 221 errors in context 3 of 9:
==5897== Conditional jump or move depends on uninitialised value(s)
==5897== at 0x422434: unload_node (dictionary2.c:28)
==5897== by 0x422534: unload_node (dictionary2.c:30)
==5897== by 0x42362C: unload (dictionary2.c:170)
==5897== by 0x421564: main (speller.c:152)
==5897== Uninitialised value was created by a heap allocation
==5897== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5897== by 0x423216: load (dictionary2.c:131)
==5897== by 0x420992: main (speller.c:40)
==5897==
==5897==
==5897== 739 errors in context 4 of 9:
==5897== Conditional jump or move depends on uninitialised value(s)
==5897== at 0x4213E7: main (speller.c:119)
==5897== Uninitialised value was created by a heap allocation
==5897== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5897== by 0x423216: load (dictionary2.c:131)
==5897== by 0x420992: main (speller.c:40)
==5897==
==5897==
==5897== 739 errors in context 5 of 9:
==5897== Conditional jump or move depends on uninitialised value(s)
==5897== at 0x4213C0: main (speller.c:119)
==5897== Uninitialised value was created by a heap allocation
==5897== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5897== by 0x423216: load (dictionary2.c:131)
==5897== by 0x420992: main (speller.c:40)
==5897==
==5897==
==5897== 739 errors in context 6 of 9:
==5897== Conditional jump or move depends on uninitialised value(s)
==5897== at 0x422DD5: check (dictionary2.c:83)
==5897== by 0x421363: main (speller.c:112)
==5897== Uninitialised value was created by a heap allocation
==5897== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5897== by 0x423216: load (dictionary2.c:131)
==5897== by 0x420992: main (speller.c:40)
==5897==
==5897==
==5897== 9185 errors in context 7 of 9:
==5897== Conditional jump or move depends on uninitialised value(s)
==5897== at 0x422434: unload_node (dictionary2.c:28)
==5897== by 0x422534: unload_node (dictionary2.c:30)
==5897== by 0x422534: unload_node (dictionary2.c:30)
==5897== by 0x42362C: unload (dictionary2.c:170)
==5897== by 0x421564: main (speller.c:152)
==5897== Uninitialised value was created by a heap allocation
==5897== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5897== by 0x423216: load (dictionary2.c:131)
==5897== by 0x420992: main (speller.c:40)
==5897==
==5897==
==5897== 367081 errors in context 8 of 9:
==5897== Conditional jump or move depends on uninitialised value(s)
==5897== at 0x423205: load (dictionary2.c:127)
==5897== by 0x420992: main (speller.c:40)
==5897== Uninitialised value was created by a heap allocation
==5897== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5897== by 0x422E91: load (dictionary2.c:104)
==5897== by 0x420992: main (speller.c:40)
==5897==
==5897==
==5897== 9534726 errors in context 9 of 9:
==5897== Conditional jump or move depends on uninitialised value(s)
==5897== at 0x422434: unload_node (dictionary2.c:28)
==5897== by 0x422534: unload_node (dictionary2.c:30)
==5897== by 0x422534: unload_node (dictionary2.c:30)
==5897== by 0x422534: unload_node (dictionary2.c:30)
==5897== by 0x42362C: unload (dictionary2.c:170)
==5897== by 0x421564: main (speller.c:152)
==5897== Uninitialised value was created by a heap allocation
==5897== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5897== by 0x423216: load (dictionary2.c:131)
==5897== by 0x420992: main (speller.c:40)
==5897==
==5897== ERROR SUMMARY: 9913647 errors from 9 contexts (suppressed: 0 from 0)
字典2.c:
// Implements a dictionary's functionality
#include "dictionary.h"
// Define node to be used in hashtable
typedef struct node
{
bool is_word;
struct node *children[27];
}
node;
// Define root
node *root;
// Global variable to track word count
unsigned int word_count = 0;
// Global boolean to track whether dictionary was loaded or not
bool loaded = false;
// Helper function to unload trie nodes
void unload_node(node *firstnode)
{
for (int i = 0; i < 27; i++)
{
if (firstnode->children[i] != NULL) // line 28
{
unload_node(firstnode->children[i]); // line 30
}
}
free(firstnode);
return;
}
// Returns true if word is in dictionary else false
bool check(const char *word)
{
// TODO
// Copy the word as word only has read access
int length = strlen(word);
char word_copy[length + 1];
// Lowercase the word
for (int i = 0; i < length; i++)
{
word_copy[i] = tolower(word[i]);
}
// Nul terminate the string
word_copy[length] = '\0';
// Direct traversal pointer to root
node *trav = root;
for (int i = 0, n = strlen(word_copy); i < n; i++)
{
// Find numerical value of letter
int alphanum;
if (word_copy[i] == 39)
{
// If it is apostrophe, allocate last slot in array
alphanum = 26;
}
else
{
alphanum = word_copy[i] - 97;
}
if (trav->children[alphanum] != NULL) // line 73
{
trav = trav->children[alphanum];
}
else
{
return false;
}
}
return trav->is_word; // line 83
}
// Loads dictionary into memory, returning true if successful else false
bool load(const char *dictionary)
{
// TODO
// Open dictionary file
FILE *inptr = fopen(dictionary, "r");
if (inptr == NULL)
{
fclose(inptr);
fprintf(stderr, "Could not open %s.\n", dictionary);
return 2;
}
// Scan through every word in dictionary and store into new node
char wordBuffer[LENGTH + 1];
// Malloc root node
root = (node*) malloc(sizeof(node)); // line 104
while (fscanf(inptr, "%s", wordBuffer) != EOF)
{
// Create traversal pointer to the root
node *trav = root;
for (int i = 0, n = strlen(wordBuffer); i < n; i++)
{
// Find numeric value of letter
int alphanum;
if (wordBuffer[i] == 39)
{
// If it is apostrophe, allocate last space in children's array
alphanum = 26;
}
else
{
alphanum = wordBuffer[i] - 97;
}
if (trav->children[alphanum] == NULL) // line 127
{
// If node does not exist in array slot, allocate memory for new node
trav->children[alphanum] = malloc(sizeof(node)); // line 131
}
// Redirect trav to child
trav = trav->children[alphanum];
}
trav->is_word = true;
word_count++;
}
fclose(inptr);
loaded = true;
return true;
}
// Returns number of words in dictionary if loaded else 0 if not yet loaded
unsigned int size(void)
{
// TODO
if (loaded)
{
return word_count;
}
else
{
return 0;
}
}
// Unloads dictionary from memory, returning true if successful else false
bool unload(void)
{
// TODO
node *trav = root;
unload_node(trav); // line 170
return true;
}
非常感谢任何帮助:)
最佳答案
让我们看看上下文中的第 8 个(共 9 个):
==5897== 367081 errors in context 8 of 9:
==5897== Conditional jump or move depends on uninitialised value(s)
==5897== at 0x423205: load (dictionary2.c:127)
==5897== by 0x420992: main (speller.c:40)
==5897== Uninitialised value was created by a heap allocation
==5897== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5897== by 0x422E91: load (dictionary2.c:104)
==5897== by 0x420992: main (speller.c:40)
==5897==
Conditional jump or move depends on uninitialised value(s)
这意味着您正在执行if (something)
而无需初始化something
。位于第 127 行:
if (trav->children[alphanum] == NULL)
未初始化的值必须是trav->children[alphanum]
。向上查看你的循环,你会发现你已经
root = (node*) malloc(sizeof(node)); // line 104
...
node *trav = root;
您分配了root
,但在尝试分支之前从未在其中实际设置任何值。在使用 root->children
中的条目之前,您应该将它们清空。
您还可以通过查看错误的后半部分来了解这一点:
Uninitialised value was created by a heap allocation
它指向第 104 行,告诉您第 104 行的分配创建了一个未初始化的值,这会得出相同的结论。
关于c - 通过 valgrind 从 cs50/pset5 拼写器运行 trie 字典时出现上下文错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390479/
我只想国家和资本化的值(value)。 这是我的完整代码: cities = { 'rotterdam': { 'country': 'netherlands',
想更好地了解如何比较对象类型的键。 dicOverall.exists(dic2) 返回 False,而 dicOverall.exists(dic1) 返回 True。我不太确定 .Exists 如
我是编程和 python 的新手,我不知道如何解决这个问题。 my_dict = {'tiger': ['claws', 'sharp teeth', 'four legs', 'stripes'
这个问题已经有答案了: Accessing an object property with a dynamically-computed name (19 个回答) 已关闭 8 年前。 我引用了这篇文
希望有人能帮忙。我正在使用 Python,我希望能够执行以下操作。 我有一组对象(例如形状)和一系列作用于这些对象的命令。命令的格式为命令字符串,后跟可变数量的参数,可以是字符串或整数 例如形状“矩形
我在文件中保存了一本字典。我从 python 交互式 shell 将字典加载到内存中,我的系统监视器显示 python 进程消耗了 4GB。以下命令提供以下输出: size1 = sys.getsiz
如果我运行以下代码: import json foo = [ { "name": "Bob", "occupation": "", "stand
我尝试获取列名及其索引,并将结果保存为数据框或字典: df <- data.frame(a=rnorm(10), b=rnorm(10), c=rnorm(10)) 我该怎么做?谢谢。 column
我正在尝试获取输入,如果字典 logins 有一个与我的输入匹配的键,我想返回该键的值。 logins = { 'admin':'admin', 'turtle':'password1
在 Perl 世界中有一个很棒的东西叫做 CPAN .它是开源 Perl 库的大型存储。 我使用来自 CPAN 的模块,我已经发布了 several distributions myself . 我使
这个问题已经有答案了: Is there a Python dict without values? (3 个回答) 已关闭 3 年前。 我有一个问题,我想跟踪大量值。如果我从未遇到过该值,我将执行操
想知道这是否可能。 我们有一个第 3 方库,其中包含有关用户的识别信息... 与库的主要交互是通过一个以字符串为键的 HashTable,并返回该键的信息对象图。 问题是, key 显然是区分大小写的
我是 .NET 编程的新手。对不起,如果这个问题以前被问过。 我目前正在学习 F#。 Dictionary、Hashtable 和 Map 之间有什么区别?我应该什么时候使用? 我还有一个标题中没有提
我正在尝试使用SVM进行3类分类。为此,我正在SVM培训期间准备词汇表。但是,由于我在SVM预测期间获得随机结果,因此我怀疑我的词汇创建方法中存在一些问题。我创建词汇的代码如下: //Mat trai
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
假设我有一个以下形式的嵌套字典: {'geo': {'bgcolor': 'white','lakecolor': 'white','caxis': {'gridcolor': 'white', 'l
我有一个 java 应用程序,每秒启动和停止数亿个项目(从外部脚本调用)多次。 Input: String key Output: int value 此应用程序的目的是在从未永远改变的Map(约30
我正在尝试找出字典与集合和数组相比的相对优势和功能。 我发现了一篇很棒的文章here但找不到一个简单的表格来比较所有不同的功能。 有人知道吗? 最佳答案 请参阅下表,对集合和字典进行有用的比较。 (该
我想要一个字典,它可以为字典中没有的任何键返回一个指定的值,例如: var dict = new DictWithDefValues("not specified"); dict.Add("bob78
我是 python 新手,目前仍在学习如何处理列表和字典。 我有这两个功能 def food_database(item_name, size_serv, calorie_serv, prot
我是一名优秀的程序员,十分优秀!