从不兼容的指针类型赋值和从不完全类型的取消引用指针



我正在尝试获取字符和每个字符的数量并将它们放入链表中。正如标题所述,我不断收到有关不兼容指针类型的警告以及有关取消引用不完整类型的错误。我想我说的最后一句是因为 start 为空,但我不明白为什么当我将其分配给临时时。 请帮忙。

/* 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 openedn", 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 kappan", list->start->key);
        }
        else
        {
            printf("%cn", (char) c);
        }
    }
    //free(temp);
    return 0;
}

这是完整的错误消息

getChars.c: In function ‘main’:
getChars.c:51:25: warning: assignment from incompatible pointer type [enabled by default]                                                                 
         list->start = temp;
                     ^
getChars.c:52:45: error: dereferencing pointer to incomplete type
         printf("%c kappan", list->start->key);
                                         ^

> 问题不是struct Element这样的东西。 clang在其警告中提供了更多的线索。

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

你有struct elementElement但没有struct Element.

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

使用不同的案例是冒着这种愚蠢的风险。你最好这样:

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

使用大写字母意味着您不会与内置字母冲突。 struct Element不会与任何事情发生冲突。Element_t很明显它是一种类型,不会与变量和函数名称冲突。

最新更新