错误:变量(struct)具有初始化程序但不完整类型(C)

时间:2016-11-14 21:00:15

标签: c memory-management struct compiler-errors dynamic-memory-allocation

好的,我是C的新手,需要解释为什么我会收到此错误:

“变量'newFilm'具有初始化程序但不完整的类型”

任务是创建一个名为film的结构。然后将.txt文件中的数据传递到该结构中,并创建表示.txt中所有数据的结构的链接列表

问题似乎是编译器错过了我为struct newFilm分配内存的点,我认为这是正确完成的

主文件中的代码:

char* t = (char*)malloc(sizeof(char*));
int y;
char* r = (char*)malloc(sizeof(char*));
char* g = (char*)malloc(sizeof(char*));
int rt;
double s;

List* list = newList();

//read pReadFile
char input[256];
//read characters from file being pointed at, and store into input
    while( fgets( input, 256, pReadFile )) {
        //scan each line with each variable separated by a comma
        fscanf(pReadFile,"%s %d %s %s %d %d\n", t,y,r,g,rt,s);    
        struct Film newFilm = createFilm(t,y,r,g,rt,s); //ERROR OCCURS HERE
        addToList(list, newFilm); 
}

printList(list, pWriteFile);

这是film.c源文件中的createFilm函数:

Film *createFilm(char *title, int year, char *rating,  
                  char *genre, int runtime, double score){

   Film *newFilm = (Film*)malloc(sizeof(Film));   
   // n.b. error checking to be added - to be added

    title = (char*)malloc(sizeof(title));
    newFilm->title = title;


    newFilm->year = year;

    rating = (char*)malloc(sizeof(rating));
    newFilm->rating = rating;

    genre = (char*)malloc(sizeof(genre));
    newFilm->genre = genre;


    newFilm->runtime = runtime;


    newFilm->score = score;



    return newFilm;
}

虽然我认为addToList函数没有任何问题,但我认为我会保留它以便你有更好的上下文(在database.h文件中):

void addToList(List* list, struct Film* film){

    Node *node = (Node*)malloc(sizeof(Node));

    //Generates an error message and the program terminates if 
    //insufficient memory is available.
    if (node == NULL){

        fprintf(stderr, "Error: Unable to allocate memory in list_add()\n");

        exit(EXIT_FAILURE);
    }

    //appends film to tail of linked list
    node->film = film;
    node->next = NULL;

    if (list->last == NULL){
        list->first = list->last = node;
    }
    else{
        list->last = list->last->next = node;
    }
}

提前致谢:)

1 个答案:

答案 0 :(得分:1)

您缺少结构的声明。使用struct Film;,您可以根据需要创建尽可能多的struct Film *指针,因为编译器可以确定指向电影的指针有多大(足以指向结构)。

然而,既然你所拥有的只是Film是一个结构(不是结构是什么,或者它有多大),你实际上不能创建一个struct Film变量,因为编译器可以&#39 ; t知道为此分配多少空间。有两个修复:

  1. 使整个结构可见。
  2. 这可能涉及将结构定义(不仅仅是声明)移动到头文件。 IE:

    // old film.h
    struct Film;
    
    // new film.h
    struct Film {
        int with;
        int all;
        int of;
        int the;
        int things;
        int it;
        int needs;
    };
    
    1. 使整个结构不透明,并使用不透明访问。
    2. 这意味着您永远不会在使用它的代码中的任何位置实际创建struct Film。而是编写函数来创建/销毁电影指针并访问/修改每个元素。

      通常,选项2更具可扩展性(因为更改结构不会影响代码),但选项1更容易。