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ポインターは自動的に null になります。)

于 2012-04-25T11:55:30.360 に答える
2

1 つには、メインまたは関数の外に代入ステートメントがあります。

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 に答える