C 从不兼容的指针类型赋值,并将指针解列为不完整类型

C 从不兼容的指针类型赋值,并将指针解列为不完整类型,c,C,我正在尝试获取字符和每个字符的编号,并将它们放入一个链接列表中。正如标题所述,我不断收到关于不兼容指针类型的警告和关于取消引用不完整类型的错误。我想我最后说的是因为start是null,但我不明白为什么我把它分配给temp。请帮忙 /* Author: Miller Kahihu Date: 2017-02-01 Program getChars.c */ #include <stdio.h> #include <string.h> #include <stdli

我正在尝试获取字符和每个字符的编号,并将它们放入一个链接列表中。正如标题所述,我不断收到关于不兼容指针类型的警告和关于取消引用不完整类型的错误。我想我最后说的是因为start是null,但我不明白为什么我把它分配给temp。请帮忙

/* Author: Miller Kahihu
Date:  2017-02-01
Program getChars.c
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct linkedList
{
    struct Element* start;
    int size;
} LinkedList;

typedef struct element
{
    char key;
    int value;
    struct Element* next;
} Element;

int main(int argc, char** argv)
{   
    LinkedList* list = malloc(sizeof(LinkedList));
    list->start = NULL;
    list->size = 0;

    char* fileName = NULL;
    if(argc > 1)
    {
        fileName = argv[1];
    }
    else
    {
        exit(1);
    }
    FILE* fpIn = fopen(fileName, "r");
    if(!fpIn)
    {
        fprintf(stderr, "file %s could not be opened\n", fileName);
        exit(1);
    }
    int c;
    Element* temp = (Element*) malloc(sizeof(Element));
    while((c=fgetc(fpIn)) !=EOF)
    {
        if(list->start == NULL)
        {
            temp->key = (char) c;
            temp->value = 1;
            temp->next = NULL;
            list->start = temp;
            printf("%c kappa\n", list->start->key);
        }
        else
        {
            printf("%c\n", (char) c);
        }
    }
    //free(temp);
    return 0;
}

问题不在于
结构元素
<代码>叮当声在警告中提供了更多的线索

test.c:52:25: warning: incompatible pointer types assigning to 'struct Element *' from 'Element *'
      (aka 'struct element *') [-Wincompatible-pointer-types]
            list->start = temp;
                        ^ ~~~~
您有
struct元素
元素
,但没有
struct元素

typedef struct element
{
    char key;
    int value;
    struct Element* next;
} Element;
使用不同的案例有可能导致这种错误。你最好做这样的事情:

typedef struct Element
{
    char key;
    int value;
    struct Element* next;
} Element_t;

使用大写字母表示不会与内置代码冲突<代码>结构元素不会与任何内容冲突。而且
元素\u t
使它明显是一种类型,不会与变量和函数名冲突。

问题不是
结构元素<代码>叮当声
在警告中提供了更多的线索

test.c:52:25: warning: incompatible pointer types assigning to 'struct Element *' from 'Element *'
      (aka 'struct element *') [-Wincompatible-pointer-types]
            list->start = temp;
                        ^ ~~~~
您有
struct元素
元素
,但没有
struct元素

typedef struct element
{
    char key;
    int value;
    struct Element* next;
} Element;
使用不同的案例有可能导致这种错误。你最好做这样的事情:

typedef struct Element
{
    char key;
    int value;
    struct Element* next;
} Element_t;

使用大写字母表示不会与内置代码冲突<代码>结构元素不会与任何内容冲突。而且
Element\u t
使其成为明显的a类型,并且不会与变量和函数名冲突。

似乎有一个
Element
的寄生虫fwd decl。您应该在linkedlist之前声明您的元素结构。似乎有一个
元素的寄生fwd decl
。而且你应该在linkedlist之前声明你的元素结构。但是可能不想使用
\t
后缀,特别是如果他现在或将来要针对POSIX系统的话。@JeffMercado大写应该避免与POSIX类型冲突,是吗?也许吧,但我不会冒险。后缀是限制,而不是其他所有内容的大写形式,因此保留所有内容。同样的原因,你不应该在任何东西的前面加上双下划线,因为它们也是保留的。就我个人而言,我使用的约定是在结构名称前面加下划线,而实际的类型名称前面不加下划线和大写。因此,所有用户定义的类型都是大写的。但是,可能不想使用
\t
后缀,尤其是如果他现在或将来要针对POSIX系统的话。@Jeffmerca大写应该避免与POSIX类型发生冲突吗?是的,也许,但我不会冒险。后缀是限制,而不是其他所有内容的大写形式,因此保留所有内容。同样的原因,你不应该在任何东西的前面加上双下划线,因为它们也是保留的。就我个人而言,我使用的约定是在结构名称前面加下划线,而实际的类型名称前面不加下划线和大写。因此,所有用户定义的类型都是大写的。