Предупреждение: назначение из несовместимого типа указателя для массива списка ссылок

Я выполняю программу на C, где я получаю предупреждение: warning: назначение из несовместимого типа указателя

Я копирую связанный код здесь:

//Structure I am using:

typedef struct graph_node
{
    int id;
    int weight;
    struct node *next;
}node, dummy;

node *head[10];

// Function which is generating this warning:
void print_list()
{
    int i;

    for (i = 0;i< vertex; i++)
    {
        printf ("\n ==>>%d ", head[i]->id);

        while (head[i]->next != NULL)
        {
            head[i] = head[i]->next;
            printf ("\t ==>>%d ", head[i]->id); /******This line is     generating warning  ********/
        }   
    }
}

Выше код компилируется нормально с бросками предупреждения ниже:

предупреждение: назначение из несовместимого типа указателя для массива списка ссылок

2 ответа

Вы не должны писать struct node *next; как node не является typedefЭд еще и struct node просто не существует

Вы должны повторно объявить вашу структуру как:

typedef struct graph_node
{
    int id;
    int weight;
    struct graph_node *next;
    /*     ^^^^^^           */
}node, dummy;

Почему мой код компилируется тогда

Когда пишешь просто struct node *next;твой компилятор предполагает struct node является неполным типом (только объявление) и допускает указатель на этот тип.

Когда вы конвертируете указатель типа struct node в node (который является typedef из struct graph_node), появляется предупреждение о несовместимом преобразовании указателя, чтобы предупредить вас о любом строгом нарушении правил псевдонимов или других подобных проблемах.

Предполагает struct node Быть неполным типом - это немного широкий и отдельный вопрос.

И да, предупреждение бросается за линию head[i] = head[i]->next; и не следующий:)

Проверьте этот код. Я думаю, что он, вероятно, будет работать.

 typedef struct graph_node
{
    int id;
    int weight;
    struct node *next;
}node, dummy;
node *head[10];

// Function which is generating this warning:

void print_list()
{
int i;
    for (i = 0;i< vertex; i++)
    {
        printf ("\n ==>>%d ", head[i]->id);
        while (head[i]->next->next != NULL)
        {
            head[i] = head[i]->next;
         printf ("\t ==>>%d ", head[i]->id); 
               if(head[i]->next==NULL)
{
            printf ("\t ==>>%d ", head[i]->id); 

}

        }   
    }
}
Другие вопросы по тегам