代码是:
#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/