C错误:编译时

时间:2017-07-09 21:24:11

标签: c debugging struct compiler-errors

我在C中第一次编译时遇到了很多错误。我是C编程的新手。我怎样才能解决这个问题以及为什么会这样?

我的源代码:

#include <stdio.h>
#include <stdlib.h>

struct n{
    int x;
    n *next;
};
typedef n node;

int main(){
    node *root;
    root = (node *)malloc(sizeof(node));
    root->x = 10;
    root->next = (node *)malloc(sizeof(node));
    root->next->x = 20;
    printf("%d", root->next->x);
    node *iter;
    iter = root;
    return 0;

}

当我编译代码时,我遇到了这些错误'gcc LinkedList1.c -o LinkedList1;

LinkedList1.c:13:9: error: request for member ‘x’ in something not a structure or union
     root->x = 10;
         ^
LinkedList1.c:14:9: error: request for member ‘next’ in something not a structure or union
     root->next = (node *)malloc(sizeof(node));
         ^
LinkedList1.c:15:9: error: request for member ‘next’ in something not a structure or union
     root->next->x = 20;
         ^
LinkedList1.c:16:22: error: request for member ‘next’ in something not a structure or union
     printf("%d", root->next->x);

但是当我用g ++

编译时没有问题

4 个答案:

答案 0 :(得分:2)

C和C ++在struct - 定义的含义上有所不同,C ++自动引入以类/ struct / union命名的新类型名称,而C NOT 自动引入这样的类型名称。例如,提供此online C++ draft standard

  

<强> 9。类

     

(1)类是一种类型。它的名字成为一个类名   它的范围。

     

(2)将类名插入声明它的作用域中   看到类名后立即。类名也是   插入到类本身的范围内。 ...

因此,在C ++中,struct n { n *next };引入了一个名为n的新类型,即使在struct - 手头定义中也可立即使用,这样n *next已经引用现有类型。 (请注意,C ++中的structclass几乎相同。)

C-standard在描述规范的哪个部分实际上是类型名称时并不清楚(参见,例如,这个online C draft standard):

  

6.7.2.1结构和联合说明符

     

(7)...关键字struct和union表示类型为   指定的分别是结构类型或联合类型。

     

(8)a中存在struct-declaration-list   struct-or-union-specifier在转换中声明一个新类型   单元。 ......直到完成列表的}之后,类型才是不完整的,之后就完成了。

但实际上struct n { ....}引入了一种新类型,该类型通过关键字struct和名称n标识,即通过struct n

旁注:一个有趣/有趣的事情可能是,即使在第一手结构定义中对struct n的引用也指的是不完整类型,即struct n是一个前向声明,直到封闭}。只有结构的前向声明的定义(已经引入以允许结构之间的循环引用),struct n *next才有效。

通常的做法是手动&#34;通过typedef方式引入别名,即typedef struct n node,以便node单独具有与struct n相同的含义。通常,别名与结构本身一起定义。因此,您的C代码可以如下工作:

typedef struct n{
    int x;
    struct n *next;
} node;

答案 1 :(得分:1)

在C中,如果要使用结构类型,则必须在struct前加上类型名称。通常的做法是为结构定义类型别名,以避免一直这样做。所以你的代码应该是这样的:

struct n{
    int        x;
    struct n * next;
};
typedef struct n node;

在C ++中,不需要一直添加struct(或定义额外的类型别名),因此使用g ++可以很好地编译相同的代码。

答案 2 :(得分:0)

将结构定义更改为:

num()

我在struct n { int x; struct n *next; }; typedef struct n node; 之前添加了struct个关键字。你必须这样做,但你可能会对C ++感到困惑,而C ++并不要求你这样做。

答案 3 :(得分:0)

//这将编译为C程序,并将值20作为输出:

#include <stdio.h>
#include <stdlib.h>


struct node {
  int x;
  struct node *next;
};

int main()
{
    struct node *root;

    root = (struct node *) malloc(sizeof(struct node));
    root->x = 10;
    root->next = (struct node *) malloc(sizeof(struct node));
    root->next->x = 20;
    printf("%d", root->next->x);
    struct node *iter;
    iter = root;
}

在引用结构变量时,C语言需要struct个关键字。