2015-03-31 2 views
0

Это мой код для программы, которая учитывает слова в стандартном вводе и оргваивает их в гистограмму. Существует массив структур, называемых wordArray, и я точно не знаю, как выделить для него память. Я понимаю, что есть, вероятно, другие проблемы и переменные, которые я еще не использовали, но я просто хочу знать, как исправить ошибку я получаю во время компиляции:Выделение памяти для массива структур

countwords.c: In function 'main': 
countwords.c:70:22: error: incompatible types when assigning to type 'WordInfo' 
from type 'void *' 
    wordArray[nWords] = malloc(sizeof(WordInfo)); 
        ^

Источник:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct WordInfo { 
    char * word; 
    int count; 
}; 

typedef struct WordInfo WordInfo; 

int maxWords; 
int nWords = 0; 
WordInfo* wordArray; 

#define MAXWORD 100 
int wordLength; 
char word[MAXWORD]; 
FILE * fd; 
int charCount; 
int wordPos; 

void toLower(char *s) { 
    int slen = 0; 
    while (*(s + slen) != '\0') { 
     if (*(s + slen) < 'a') *(s + slen) += 'a' - 'A'; 
     slen++; 
    } 
} 

// It returns the next word from stdin. 
// If there are no more more words it returns NULL. 
static char * nextword() { 
    char * word = (char*)malloc(1000*sizeof(char)); 
    char c = getchar(); 
    int wordlen = 0; 
    while (c >= 'a' && c <= 'z') { 
     *(word + wordlen) = c; 
     wordlen++; 
     c = getchar(); 
    } 
    if (wordlen == 0) return NULL; 
    return word; 
} 

int main(int argc, char **argv) { 
    if (argc < 2) { 
     printf("Usage: countwords filename\n"); 
     exit(1); 
    } 

    char * filename = argv[1]; 
    int wordfound = 0; 
    fd = fopen(filename, "r"); 
    char * next = nextword(); 
    while (next != NULL) { 
     int i; 
     for (i = 0; i < nWords; i++) { 
      if (strcmp((wordArray[i]).word, next)) { 
       wordArray[i].count++; 
       wordfound = 1; 
       break; 
      } 
     } 
     if (!wordfound) { 
      wordArray[nWords] = malloc(sizeof(WordInfo)); 
      strcpy(next, wordArray[nWords].word); 
      wordArray[nWords].count++; 
      nWords++; 
     } 
    } 

} 
+0

вы как глобальные переменные, а? –

ответ

0
  1. Выделите malloc как тип, который вы возвращаете.
  2. Удалить индекс для указателя.

Целью является выделение памяти для хранения массива, а затем установка указателя на него. Одна из проблем, с которой вы делали бы то, что делаете, - если вы попытаетесь сохранить адрес malloc в определенном «слоте» массива, который вы еще не создали, вы получите ошибку доступа, поскольку wordArray [n] еще не относится к какой-либо памяти.

wordArray - переменная типа указателя, которую вы пытаетесь указать на выделенную память.

wordArray = (WordInfo *)malloc(sizeof(WordInfo)); 

Тогда вы можете получить доступ к wordArray с помощью индексов.

E.g. wordArray[n]

В C указатели могут быть доступны через индексы и массивы могут ссылаться на указатели. Это разные представления и синтаксисы для почти той же вещи.

+2

Нет, вы не накладываете 'malloc' (если вы не пишете C++, и в этом случае вам следует избегать' malloc' целиком), см. Http://stackoverflow.com/questions/605845/do-i- литые в-результат-оф-таНоса –

1

Чтобы выделить место для массива nWords элементов, используйте

wordArray = malloc(nWords * sizeof(*WordInfo)); 
Смежные вопросы