2016-11-11 8 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» структуры, но когда я хочу напечатать несколько слов, это прослушивание строк или ошибок. Я уверен, что мы делаем неправильно в указателях, но где ...

Что мы делаем неправильно?

+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