gpt4 book ai didi

CS50 - 加载 - 尝试执行加载时从无处获取随机字符

转载 作者:太空宇宙 更新时间:2023-11-04 06:12:33 26 4
gpt4 key购买 nike

我是 C 编程的新手。我正在尝试在 CS50 中执行 pset5,同时尝试理解内存、链表和哈希表的概念。我编写了代码并对其进行了编译,但似乎出了点问题,因为每次我尝试执行代码时,它都会返回一些垃圾值。有人可以帮我吗?非常感谢。

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

#include "dictionary.h"

#define DICTIONARY "dictionaries/small"

typedef struct node
{
char WORD[LENGTH + 1];
struct node *next;
}
node;

int hash(char *word);

int main(void)
{
node **HASHTABLE = malloc(sizeof(node) * 26);

//open the dictionary
FILE *dic = fopen(DICTIONARY, "r");
if (dic == NULL)
{
fprintf(stderr, "Could not open the library\n");
return 1;
}

int index = 0;
char word[LENGTH + 1];

for (int c = fgetc(dic); c != EOF; c = fgetc(dic))
{
word[index] = c;
index++;

if (c == '\n')
{
int table = hash(word);
printf("%d\n", table);
//create a newnode
node *newnode = malloc(sizeof(node));
strcpy(newnode->WORD, word);
newnode->next = NULL;

printf("Node: %s\n", newnode->WORD);
index = 0;

//add new node to hash table
if (HASHTABLE[table] == NULL)
{
HASHTABLE[table] = newnode;
}
else
{
HASHTABLE[table]->next = newnode;
}
}
}
for(int i = 0; i < 26; i++)
{
node *p = HASHTABLE[i];
while (p != NULL)
{
printf("%s", p->WORD);
p = p->next;
}
}

//free memory
for(int i = 0; i < 26; i++)
{
node *p = HASHTABLE[i];
while (p != NULL)
{
node *temp = p->next;
free(p);
p = temp;
}
}
free(HASHTABLE);
}


int hash(char *word)
{
int i = 0;
if (islower(word[0]))
return i = word[0] - 'a';
if (isupper(word[0]))
return i = word[0] - 'A';
return 0;
}

enter image description here

最佳答案

您的代码存在导致未定义行为的严重问题。

其中两个是这一行的结果:

node **HASHTABLE = malloc(sizeof(node) * 26);

分配了 26 个 node structures,但是 HASHTABLE 变量需要指向 node *< 数组的指针的地址 pointers(即 node **HASHTABLE 声明中的 **)。

因此,您应该将其替换为:

node **HASHTABLE = malloc( 26 * sizeof( *HASHTABLE ) );

请注意,我使用了分配给变量的取消引用值 - HASHTABLE。这意味着在这种情况下是一个节点(比声明中少一个*)。因此,如果 HASHTABLE 的类型发生变化,您无需对 malloc() 语句进行任何其他更改。

这个问题虽然在技术上是未定义的行为,但可能不会导致任何问题。

但是还是有问题

node **HASHTABLE = malloc( 26 * sizeof( *HASHTABLE ) );

导致问题——而且是严重的问题。

那个由 26 个指针组成的数组没有初始化 - 你不知道它们里面有什么。他们可以指向任何地方。所以这不会很好地工作,如果有的话:

    if (HASHTABLE[table] == NULL)

意思是指向未知的地方:

    HASHTABLE[table]->next = newnode;

会导致各种问题。

最简单的修复?使用 calloc() 而不是 malloc() 将所有值初始化为零:

node **HASHTABLE = calloc( 26, sizeof( *HASHTABLE ) );

在这个问题得到解决之前,您整个程序的任何结果充其量都是有问题的。

关于CS50 - 加载 - 尝试执行加载时从无处获取随机字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53327543/

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