2016-11-11 120 views
-1

在目前我有一个项目的研究和我和一个朋友并不真正知道如何解决这个问题的一部分。在一个结构体中的数组并填充他

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

我们做错了什么?

+1

我们需要一个完整的源代码示例,包括输入和输出 – KevinDTimm

+0

'char ** words []'看上去很腥。你想要完成什么?无论如何,你不会选择正确的类型。注意编译器警告并加以纠正。一般来说,也不要将'malloc'&friends或'void *'的结果强制转换。 – Olaf

回答

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. 删除free(word)行;你不想取消分配这个空间,因为它是由字典结构引用的。
+0

好的,这就是为什么我们有一些麻烦,现在我明白我们做错了,谢谢你的回复:D – Maillful