0

这是我写的一个小程序,(我还在写),但是到目前为止,根据我的理解,编译程序不应该给出任何错误。

#include <stdio.h>
#include <stdlib.h>
struct node t1 {
        int data;
        struct node *next, *prev;
};
struct node *root;
root = NULL;
int main()
{
        int i, j, choice, count;
        printf("enter choice\n");
        scanf("%d", &choice);
        count = 0;
        while (choice == 1) {
                printf("enter a data element");
                scanf("%d", &j);
                count++;
        }

}

void push()
{
}

void pop()
{
}

我得到的错误是

 cc linklist.c
linklist.c:3:16: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
linklist.c:8:1: warning: data definition has no type or storage class [enabled by default]
linklist.c:8:1: error: conflicting types for ‘root’
linklist.c:7:14: note: previous declaration of ‘root’ was here
linklist.c:8:8: warning: initialization makes integer from pointer without a cast [enabled by default]

我使用 gcc 和 Ubuntu 11.04。编译代码时出现警告的原因是什么。

4

4 回答 4

4
struct node *root;
root = NULL;

您不能在函数之外进行这样的分配。删除它,root = NULL因为它对于具有静态存储的对象(例如全局变量)是隐式的。

编辑

正如 Tom Dignan 所发现的,结构声明也是错误的:

struct node t1 { ... };
            ^^
于 2012-04-25T11:55:04.367 回答
2

您不能root = NULL;在顶层(在任何函数之外)发表声明。做

struct node *root = NULL;

(这= NULL部分实际上是可选的;全局或static指针自动为空。)

于 2012-04-25T11:55:30.360 回答
2

一方面,您在 main 或函数之外有一个赋值语句。

root = NULL;

我没有尝试过其他任何东西。

于 2012-04-25T11:57:21.797 回答
2
struct node t1 {
        int data;
        struct node *next, *prev;
};

您想为结构节点创建别名。它应该是:

typedef struct node  { /* typedef! */
        int data;
        struct node *next, *prev;
}t1; /* alternative name go here */
于 2012-04-25T12:01:36.367 回答