从不兼容的指针类型和解除指针到不完整类型的赋值

时间:2017-02-05 19:53:54

标签: c

我正在尝试获取字符数和每个字符数并将它们放入链表中。正如标题所述,我不断收到有关不兼容指针类型的警告以及有关取消引用不完整类型的错误。我认为我说的最后一个是因为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;
}

以下是完整的错误消息

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 kappa\n", list->start->key);
                                         ^

1 个答案:

答案 0 :(得分:3)

问题不在于struct Elementclang在警告中提供了更多线索。

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使其显然是一种类型,并且不会与变量和函数名称冲突。