#include <stdio.h>
#include <stdlib.h>
struct NODE {
char* name;
int val;
struct NODE* next;
};
typedef struct NODE Node;
Node *head, *tail;
head = (Node*) malloc( sizeof( Node ) ); //line 21
そして私はこのようにコンパイルします:
cc -g -c -o file.tab.o file.tab.c
このエラーメッセージが表示されます:
file.y:21:1 warning: data definition has no type or storage class [enabled by default]
線のように見えます
_head = (Node*) malloc( sizeof( Node ) ); //line 21
_
main()
関数の外にあります。関数の外部でコードを実行できないため、これを行うことはできません。グローバルスコープで実行できるのは、変数を宣言することだけです。main()
またはその他の関数内に移動するだけで、問題はなくなるはずです。
(追記: この質問 型キャストしてはいけない理由を見てくださいmalloc
)
コードを関数内に配置する必要があります。
#include <stdio.h>
#include <stdlib.h>
struct NODE {
char* name;
int val;
struct NODE* next;
};
typedef struct NODE Node;
main(){
Node *head, *tail;
head = (Node*) malloc( sizeof( Node ) ); //line 21
}
動作するはずです
問題は、関数内で実行していないときにmalloc
を呼び出そうとしていることです。これをmain
関数でラップすると、次のようになります。
int main(int argc, char **argv)
{
Node *head, *tail;
head = (Node*) malloc( sizeof( Node ) );
/* ... do other things ... */
return 0;
}
…問題なく動作します。 GCCのエラーは少しわかりにくいですが、問題は基本的に、定数ではないもので変数を初期化しようとしていることです。これは関数の外部では不可能です。
Malloc宣言と変数宣言をmain関数に入れて、mallocのキャストを削除してみてください。次のようになります。
#include <stdio.h>
#include <stdlib.h>
int main(){
struct NODE
{
char* name;
int val;
struct NODE* next;
};
typedef struct NODE Node;
Node *head, *tail;
head = malloc( sizeof(Node) ); //line 21
}