2016-11-11 42 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