gpt4 book ai didi

c - 结构体中的数组并填充他

转载 作者:行者123 更新时间:2023-11-30 19:36:43 25 4
gpt4 key购买 nike

目前我有一个研究项目,我和一个 friend 真的不知道如何解决其中的部分问题。

所以,这是一个 C 项目。我有 2 个结构:

struct Lib {
char letter;
int capacity;
int size;
char** words[200000];
};
typedef struct Lib Library;
struct Program {
char* loadedFileName[50];
FILE* f;
Library* dictionary;
int totalwords;
};

typedef struct Program Program;

这个函数:

void fillDicoFromFile(Program* startup){
rewind(startup->f);
while(!feof(startup->f) && !ferror(startup->f)){
char* word = malloc(sizeof(char) * 30);
fscanf(startup->f, "%s", word);
int indexLib = word[0] - 97;
int sizeLib = startup->dictionary[indexLib].size;
startup->dictionary[indexLib].words[sizeLib] = (char*)malloc(sizeof(char) * (strlen(word)+1));
startup->dictionary[indexLib].words[sizeLib] = word;
startup->dictionary[indexLib].size++;
free(word);
}
CountTotalWords(startup);
}

startup->dictionary是一个由26个库组成的数组,当我从文件中得到一个单词时,我检查他的第一个字母并选择好的库(startup->dictionary[0] for 'a' ...)然后将单词放在结构体的数组“word”上,但是当我想要 printf 一些单词时,它是有问题的字符串或错误的字符串。我很确定我们在指针上做错了,但是哪里......

我们做错了什么?

最佳答案

这个:

    startup->dictionary[indexLib].words[sizeLib] = (char*)malloc(sizeof(char) * (strlen(word)+1));
startup->dictionary[indexLib].words[sizeLib] = word;

...并没有按照你的想法去做。您正在分配空间(使用malloc,第一行),但您没有使用它;相反,您将在 word (第二行)中存储指向先前分配的空间的指针。需要明确的是,语句 startup->dictionary[indexLib].words[sizeLib] = word 不会复制字符串;它只是分配一个指针。

然后,您释放该空间:

    free(word);

字典现在包含一个悬空指针 - 指向不再分配的区域的指针。修复很简单:

  1. 删除上面的第一行(使用malloc);您无需为已分配空间的单词分配空间
  2. 删除free(word)行;您不想释放这个空间,因为它是由字典结构引用的。

关于c - 结构体中的数组并填充他,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40557418/

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