【问题标题】:array in a struct and populate him结构中的数组并填充他
【发布时间】:2016-11-11 22:49:18
【问题描述】:

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

所以,这是一个 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' ...)然后将单词放在结构的数组“单词”上,但是当我想要 printf 一些单词时,它是错误的字符串或错误的字符串。我很确定我们在指针上做错了,但在哪里......

我们做错了什么?

【问题讨论】:

  • 我们需要一个完整的源代码示例,包括输入和输出
  • char** words[] 看起来很可疑。你想要完成什么?无论如何,您没有转换正确的类型。注意编译器警告并提高它们。也不要投射malloc & friends 或void * 一般的结果。

标签: c arrays pointers struct


【解决方案1】:

这个:

    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) 行;你不想释放这个空间,因为它被字典结构引用。

【讨论】:

  • 好的,这就是我们遇到麻烦的原因,现在我知道我们做错了什么,谢谢您的回复:D
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
相关资源
最近更新 更多