2015-03-31 208 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

你喜歡的全局變量,是吧? – 2015-03-31 00:56:43

回答

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-鑄了對結果的-的malloc – 2015-03-31 01:13:20

1

要爲nWords元素的數組分配空間,使用

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