объявление указателя структуры дает ошибку - PullRequest
1 голос
/ 19 июня 2011
struct node {
int data;
struct node  *next;
};
struct node * list,root;
list=NULL;
root=NULL;

Это то, что я пытаюсь создать в своей программе, и моя программа при компиляции выдает ошибку

kbc.c:8: warning: data definition has no type or storage class
kbc.c:8: error: conflicting types for ‘list’
kbc.c:7: note: previous declaration of ‘list’ was here
kbc.c:8: warning: initialization makes integer from pointer without a cast
kbc.c:9: warning: data definition has no type or storage class
kbc.c:9: error: conflicting types for ‘root’
kbc.c:7: note: previous declaration of ‘root’ was here
kbc.c:9: warning: initialization makes integer from pointer without a cast

Вот полная программа, если кто-то хочет увидеть, я просто создаю программу для написания списка ссылок

#include<stdio.h>
#include<stdlib.h>
struct node {
int data;
struct node  *next;
};
struct node * list,root;
list=NULL;
root=NULL;
struct node * create_node(int );
int main ()
{
int i,j,choice;
printf("Enter a number this will be root of tree\n");
scanf("%d",&i);
printf("Give us choice 1 to enter more numbers 0 to quit\n");
scanf("%d",&choice);
switch (choice)
        {
        case 1:break;

        case 2:break;
        }
}
// end of function main
struct node * create_node(int data)
{
struct node *temp;
t    emp = (struct node *)malloc(sizeof(struct node));
return temp;
}

Ответы [ 2 ]

3 голосов
/ 19 июня 2011

Часть проблемы в том, что вы объявили один указатель и одну структуру. Ваши объявления эквивалентны:

struct node *list;
struct node  root;

Именно поэтому '*', указывающий на указатель, принадлежит имени переменной ( объявитель в стандартном), а не типу.

Другая часть проблемы заключается в том, что вы можете инициализировать переменную только в глобальной области видимости с (постоянным) инициализатором; Вы не можете писать назначения в глобальной области видимости.

Есть несколько способов исправить это:

typedef struct node *NodePtr;
NodePtr list = NULL, root = NULL;

struct node *list = NULL, *root = NULL;

struct node *list = NULL;
struct node *root = NULL;

Обратите внимание, что одной из многих причин не использовать #define вместо typedef является то, что:

#define NodePtr struct node *        // BAD!
NodePtr list = NULL, root = NULL;    // BAD!

создает именно ошибочную ситуацию в вопросе.

Обращение к некоторым сообщениям об ошибках:

kbc.c:8: warning: data definition has no type or storage class

Это относится к строке:

list = NULL;

Поскольку вы пишете в глобальной области видимости, это интерпретируется как определение переменной без явного типа. В настоящее время это ужасный стиль, но он был разрешен в оригинальном (предварительно стандартном) C с использованием правила «implicit- int» для вывода типа - что также объясняет некоторые из последующих сообщений. Интерпретация 'implicit- int' устарела в C89 и официально не поддерживается C99, но компиляторы по-прежнему распознают ее (с предупреждением, по крайней мере, в режиме C99).

Итак, это интерпретируется как:

int list = NULL;

Эти сообщения теперь поясняются:

kbc.c:8: error: conflicting types for ‘list’
kbc.c:7: note: previous declaration of ‘list’ was here

Вы написали код, который компилятор должен интерпретировать как второе объявление list.

kbc.c:8: warning: initialization makes integer from pointer without a cast

И это объясняется; поскольку второй list является int и NULL является константой нулевого указателя в этой реализации (вероятно, #define NULL ((void *)0)), происходит преобразование из указателя в целое число без приведения.

Второй набор предупреждений применяется аналогично root.

3 голосов
/ 19 июня 2011

Это не нормально в глобальной области видимости:

struct node * list,root;
list=NULL;
root=NULL;

Попробуйте это:

struct node *list=NULL, *root=NULL;

Причина в том, что вы не можете поставить операторы для выполнения (например, list=NULL)вне функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...