gpt4 book ai didi

c - 传递给某些函数后指针消失(即使使用 malloc)

转载 作者:行者123 更新时间:2023-11-30 16:32:15 25 4
gpt4 key购买 nike

我的问题是我在 Main 底部创建了一个指针。

Main 将调用 load() 从字典中读取输入,并通过调用 insert() 和 getnode() 将输入文件中的单词插入到 TRIE *dict 中。然而,在 load() 返回 true 后, *dict 丢失了所有值,我无法得到我所期望的结果(即显示 cat 存在于我的字典输入文件中)。

我从其他网站上了解到,指针在进行 malloc 后可以保留其值。所以我已经为 *dict 分配了内存。请让我知道为什么该值消失了。

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

#define CHAR_TO_INDEX(c) ((int)c - (int)'a')

#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])

struct dict
{
char words[46];
struct dict* dictPath[26];
bool isEndOfWord;
};


// Returns new trie node (initialized to NULLs)
struct dict *getNode(void)
{

struct dict *pNode = NULL;
pNode = (struct dict *)malloc(sizeof(struct dict));

if (pNode)
{
int i;

for (i = 0; i < 26; i++)
pNode->dictPath[i] = NULL;
}

return pNode;
}

void insert(struct dict *root, const char *key)
{
int level;
int length = strlen(key);
int index;

struct dict *pCrawl = root;

for (level = 0; level < length; level++)
{
index = CHAR_TO_INDEX(key[level]);
if (!pCrawl->dictPath[index])
{
pCrawl = malloc(sizeof(struct dict));
pCrawl->dictPath[index] = getNode();
}
printf("%i\n",index);
pCrawl = pCrawl->dictPath[index];
}

// mark last node as leaf
pCrawl->isEndOfWord = true;
}

// Returns true if key presents in trie, else false
bool search(struct dict *root, const char *key)
{
int level;
int length = strlen(key);
int index;
struct dict *pCrawl = root;

for (level = 0; level < length; level++)
{
index = CHAR_TO_INDEX(key[level]);

if (!pCrawl->dictPath[index])
{
return false;
}

pCrawl = pCrawl->dictPath[index];
}

return (pCrawl != NULL && pCrawl->isEndOfWord);
}

bool load(struct dict *root, char *inputfile){

// open the dictionary file
FILE *infile = fopen(inputfile,"r");
int dictchar;
char tmpword[46];
int cnt = 0;

root = getNode();

// start iterating to read char
do
{
// read the character
dictchar = fgetc(infile);
if (dictchar != '\n')
{
// assign the dictionary character to a tmpword. tmpword will be used to fit into TRIES later
tmpword[cnt] = dictchar;
cnt ++;
}
// if the character is '\n', fit tmpword into TRIES
else
{
tmpword[cnt] = '\0';
cnt = 0;
for (int i = 0; i < ARRAY_SIZE(tmpword); i++)
insert(root, tmpword);
}
} while (dictchar != EOF);


return true;
}

int main (int argc, char *argv[]){
if (argc != 2)
{
return 1;
}
struct dict *root = malloc(sizeof(struct dict));
load(root, argv[1]);
char output[][32] = {"Not present in trie", "Present in trie"};
printf("%s --- %s\n", "cat", output[search(root, "cat")] );
return 0;

}

附:我引用了https://www.geeksforgeeks.org/trie-insert-and-search/

最佳答案

在你的函数中,

bool load(struct dict *root, char *inputfile)

您传递一个root指针,但随后将其替换为getNode的结果。调用代码不会看到此更改。您需要传递一个指向根指针的指针,

bool load(struct dict **root, char *inputfile)

让调用代码看到变化。

更简单地说,因为您丢弃了 root

root = getNode();

在函数顶部附近,您可以更改 load 签名:

struct dict * load(char *inputfile)

最后不是return true;,而是return root;。无论如何,你都没有返回 flase 的路径。

也更改调用代码。而不是

struct dict *root = malloc(sizeof(struct dict));
load(root, argv[1]);

试试这个:

struct dict *root = load(argv[1]);

关于c - 传递给某些函数后指针消失(即使使用 malloc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50235607/

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