为什么我会得到这个错误:"数据定义没有类型或存储类"?

16
#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]
4个回答

36

看起来像是这条线

head = (Node*) malloc( sizeof( Node ) ); //line 21

main()函数之外的代码不能执行,因为不能在函数之外执行代码。你只能在全局范围内声明变量。 把它移动到main()或任何其他函数中,问题应该就解决了。

(PS:看一下这个问题,了解为什么不应该对malloc进行类型转换)


1
为这个问题奋斗了一个小时...太傻了...现在我感到很尴尬,哈哈,谢谢!! - mgrenier
@streppel,当我写dev_t dev; dev = MKDEV(300, 0)时,我遇到了相同的错误,但是如果我写dev_t dev = MKDEV(300, 0),我的模块就可以正常运行。这是为什么?背后的原因是什么? - Dr. Essen
@Dr.Essen MKDEV 是一个宏。结果值在编译时预先计算。 - Robert

2
你需要将你的代码放在一个函数里面:
#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
}

应该可以工作。

2
问题在于你试图在不执行函数的情况下调用 malloc。如果你将其放在一个 main 函数内部,例如:
int main(int argc, char **argv)
{
    Node *head, *tail;
    head = (Node*) malloc( sizeof( Node ) );
    /* ... do other things ... */
    return 0;
}

…它完全正常工作。 GCC的错误有点神秘,但问题基本上是您试图使用不是常量的东西来初始化变量,这在函数外部是不可能的。


2
尝试将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
}

如果您希望结构体定义(以及相关的typedef)可以被项目的其他部分重复使用,那么您可能需要将它们从main中移出。 - Matt Patenaude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接