gpt4 book ai didi

c - strncpy 中的段错误 - 从字典加载

转载 作者:行者123 更新时间:2023-12-02 05:12:47 24 4
gpt4 key购买 nike

我有这个函数“加载”,我从字典中读取单词并将它们放入链接列表的哈希表中。当我尝试读取一行并将其保存在我的 new_node->text 中时,编译器返回 SEGMENTATION FAULT,我不知道为什么。使用 strncpy 时出现错误。

#define HASHTABLE_SIZE 76801


typedef struct node
{
char text[LENGTH+1];
//char* text;
//link to the next word
struct node* next_word;
}
node;


node* hashtable[HASHTABLE_SIZE];

bool load(const char* dictionary)
{
FILE* file = fopen(dictionary,"r");
unsigned long index = 0;
char str[LENGTH+1];

if(file == NULL)
{
printf("Error opening file!");
return false;
}

while(! feof(file))
{
node * new_node = malloc(sizeof(node)+1000);


while( fscanf(file,"%s",str) > 0)
{
printf("The word is %s",str);
strncpy(new_node->text,str,LENGTH+1);
//strcpy(new_node->text,str);

new_node->next_word = NULL;
index = hash( (unsigned char*)new_node->text);

if(hashtable[index] == NULL)
{
hashtable[index] = new_node;
}
else
{
new_node->next_word = hashtable[index];
hashtable[index] = new_node;
}

n_words++;

}
//free(new_node);



}
fclose(file);
loaded = true;

return true;
}

最佳答案

让我们逐行查看您的代码,好吗?

    while(! feof(file))
{

这不是使用 feof 的正确方法 - 查看帖子 Why is “while ( !feof (file) )” always wrong?就在 StackOverflow 上。

        node * new_node = malloc(sizeof(node)+1000);

嗯,好的。我们为一个节点和 1000 字节分配空间。这有点奇怪,但是嘿...RAM 很便宜。

        while( fscanf(file,"%s",str) > 0)
{

嗯...另一个循环?好的...

            printf("The word is %s",str);
strncpy(new_node->text,str,LENGTH+1);
//strcpy(new_node->text,str);

new_node->next_word = NULL;
index = hash( (unsigned char*)new_node->text);

嘿!等一下...在这第二个循环中,我们不断地重复覆盖 new_node...

            if(hashtable[index] == NULL)
{
hashtable[index] = new_node;
}
else
{
new_node->next_word = hashtable[index];
hashtable[index] = new_node;
}

暂时假设两个词散列到同一个桶中:

好的,所以第一次通过循环时,hashtable[index] 将指向 NULL 并被设置为指向 new_node

第二次循环,hashtable[index] 不是NULL 所以new_node 将指向任何hashtable[index] 指向(提示:new_node)并且 hashtable[index] 将指向 new_node) .

你知道什么是ouroboros吗?是吗?

现在假设它们不散列到同一个桶:

其中一个桶现在包含错误信息。如果您首先在存储桶 1 中添加“hello”,然后在存储桶 2 中添加“再见”,那么当您尝试遍历存储桶 1 时,您可能(仅因为链接代码已损坏)找到不属于存储桶 1 的“再见”全部。

您应该为要添加的每个 单词分配一个 节点。不要重复使用相同的节点。

关于c - strncpy 中的段错误 - 从字典加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15142349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com