Akh*_*hil 1 c gcc pointers declaration
我使用gcc编译器编译了以下c代码:
#include <stdio.h>
struct node{
int info;
struct test* next;
};
int main()
{
struct node start;
struct node* p;
start.info = 2;
start.next = (struct test*)&start;
printf("start.next = %p \n",start.next);
p = start.next;
printf("p->info = %d\n",p->info);
}
Run Code Online (Sandbox Code Playgroud)
但令我惊讶的是,在声明next(in structure node)作为指向未声明类型(struct test)的指针之后,仍然编译成功!编译完上述程序后,其打印仅发出如下警告:
test.c:15:4: warning: assignment from incompatible pointer type [enabled by default]
p = start.next;
^
Run Code Online (Sandbox Code Playgroud)
现在我怀疑为什么编译器没有因为没有声明而产生错误structure test?
您的程序中没有未定义的类型.struct test结构中声明了一个不完整的类型struct node.您可以使用指向不完整类型的指针.
考虑一个简化的例子,会更清楚
struct node{
int info;
struct node* next;
};
Run Code Online (Sandbox Code Playgroud)
在此结构中,指针next也指向不完整类型,struct node因为结构定义将仅在结束括号之后完成.
一个更有趣的例子.类型void *在C程序中非常常用.但是根据C标准(6.2.5类型,第19页)
19 void类型包含一组空值; 它是一个不完整的对象类型,无法完成.
至于指针本身那么(C标准,6.2.5类型,第21页)
A pointer type is a complete object type.
Run Code Online (Sandbox Code Playgroud)
关于结构本身(6.7.2.1结构和联合说明符,第8页)
8 struct-or-union-specifier中struct-declaration-list的存在在转换单元中声明了一个新类型.struct-declaration-list是结构或联合成员的一系列声明.如果struct-declaration-list不包含命名成员,没有匿名结构,也没有匿名联合,则行为未定义.直到终止列表的}之后,类型才是不完整的,之后就完成了.