Предупреждение: назначение из несовместимого типа указателя для массива списка ссылок
Я выполняю программу на 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);
}
}
}
}