结构指针声明给出错误

时间:2011-06-19 15:57:01

标签: c pointers struct

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 个答案:

答案 0 :(得分:3)

这在全球范围内不合适:

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

试试这个:

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

原因是您无法在函数外部执行语句(如list=NULL)。

答案 1 :(得分:3)

部分问题是你已经声明了一个指针和一个结构。您的声明等同于:

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中允许使用'隐式 - int'规则来推断类型 - 这也解释了一些后续消息。 '隐式 - 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

这是解释;由于第二个listintNULL在此实现中是一个空指针常量(可能是#define NULL ((void *)0)),因此从指针到整数的转换没有铸造。

第二组警告类似于root