我在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 ++
编译时没有问题答案 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 ++中的struct
和class
几乎相同。)
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
个关键字。