为struct i数组分配内存会出错

时间:2016-10-18 07:25:41

标签: c data-structures allocation

代码是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20

typedef struct word{

    char word[20];
    int occurrance;
} word;

int array_word_creator(word *array, FILE *fp);
void initialize(word array[], int max);
void comparator(word array[], int max, FILE *fp);
void printer(word array[], int max);





int main(int argc, char *argv[])
{
    FILE *f_sent, *f_words;
    word *array;
    int arr_lenght=0;
    if(argc!=3)
    {
        printf("Wrong argument number, please use NAME FILE1 FILE2;\n");
        exit(EXIT_FAILURE);
    }
    if((f_sent=fopen(argv[1], "r"))==NULL||(f_words=fopen(argv[1], "r"))==NULL)
    {
        printf("Can't find or open the files, please check if the name is correct\n");
        exit(EXIT_FAILURE);
    }
    arr_lenght=array_word_creator(array, f_words);
    comparator(array, arr_lenght ,f_sent);
    printer(array, arr_lenght);

    return 0;
}

int array_word_creator(word *array, FILE *fp)
{
    int n,i=0;
    fscanf(fp,"%d",&n);
    *array= malloc(n*sizeof(word));
    while(fscanf(fp,"%s", array[i].word)!=EOF)
    {
        i++;
    }
    initialize(array,n);

    return n;
}

void initialize(word array[], int max)
{
    int i;
    for(i=0;i<max;i++)
    {
        array[i].occurrance=0;
    }
}

void comparator(word array[], int max, FILE *fp)
{
    char word[MAX];
    int i;
    while(fscanf(fp,"%s", word)!=EOF)
    {
        for(i=0;i<max;i++)
        {
            if(strcmp(word, array[i].word)==0)
            {
                array[i].occurrance++;
            }
        }
    }
}

void printer(word array[], int max)
{
    int i;
    for(i=0;i<max;i++)
    {
        if(array[i].occurrance>0)
        {
            printf("The word '%s' occurs %d times\n", array[i].word, array[i].occurrance);
        }
    }
}

编译器说我:

C:\Users\Matteo\Google Drive\Programming\C\lab3\es1\main.c|47|error: incompatible types when assigning to type 'word' from type 'void *'|

我刚研究了内存分配,所以我遇到了一些问题,尤其是结构问题。如果可能的话,请联系我一些关于这个主题的好文档。

谢谢你!

2 个答案:

答案 0 :(得分:1)

main word *数组中是指向word类型结构的指针。

然后将数组(不指向任何内容)传递给函数array_word_creator。

然后尝试将malloc返回的指针分配给数组所指向的位置,但它还没有指向任何地方,即使它确实存在,也会指向一个单词(因为它是一个单词*),所以它不能存储指针,因此编译错误。

如果要将main中的数组指针设置为malloc的结果,则必须将指针传递给指针。 int array_word_creator(word **array, FILE *fp),然后你可以通过array_word_creator(&array, .... )来调用它,你的* array = malloc就可以了。

答案 1 :(得分:0)

你想要这个:

...
arr_lenght = array_word_creator(&array, f_words);
...


int array_word_creator(word **array, FILE *fp)
{
  int n, i = 0;
  fscanf(fp, "%d", &n);
  *array = malloc(n * sizeof(word));
  while (fscanf(fp, "%19s", (*array)[i].word) != EOF)
  {
    i++;
  }
  initialize(*array, n);

  return n;
}