在一个结构中的数组并填充他

时间:2016-11-11 22:49:18

标签: c arrays pointers struct

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

所以,这是一个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->字典是一个26库的数组,当我从文件中得到一个单词时,我检查他的第一个字母并选择好的库(startup->字典[0]为'a'.. 。)然后将这个单词放在结构的数组“单词”上,但是当我想要printf一些单词时,它就会出现错误的字符串错误。我很确定我们在指针上做错了但是......

我们做错了什么?

1 个答案:

答案 0 :(得分:0)

此:

    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. 分配空间的单词分配空间
  3. 删除free(word)行;你不想释放这个空间,因为它被字典结构引用。