为结构数组分配内存

时间:2015-03-31 00:48:36

标签: c arrays struct

这是我的程序代码,它对标准输入中的单词进行计数,并将它们整理成直方图。有一个名为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++;
        }
    }

}

2 个答案:

答案 0 :(得分:1)

要为nWords元素数组分配空间,请使用

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

答案 1 :(得分:0)

  1. 将malloc投射为您要返回的类型。
  2. 删除指针的下标。
  3. 您的目标是分配内存来保存数组,然后设置指向它的指针。您正在做的事情的一个问题是,如果您尝试保存地址malloc返回到您尚未创建的数组的特定“槽”中,您将收到访问错误,因为wordArray [n]还没有提到任何记忆。

    wordArray是指针类型变量,你试图指向你分配的内存。

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

    然后你可以使用下标访问wordArray。

    E.g。 wordArray[n]

    在C指针中可以通过下标访问,数组可以用指针引用。对于几乎相同的事物,它们是不同的表示和语法。