代码是:

#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 *'|


我刚刚研究了内存分配,因此遇到了一些麻烦,尤其是在结构方面。如果可能的话,请给我链接关于这个主题的一些好的文档。

谢谢!

最佳答案

main中,* array是指向word类型结构的指针。

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

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

如果要将main中的数组指针设置为malloc的结果,则必须将指针传递给该指针。 int array_word_creator(word **array, FILE *fp),那么您可以通过执行array_word_creator(&array, .... )来调用它,您的* array = malloc将起作用。

关于c - 为结构数组分配内存出现错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40102049/

10-11 15:15
查看更多