结构体声明后置*start:未初始化节点为何可作节点指针?
结构体声明中
*start的写法与指针使用问题 一、} *start;的写法逻辑
这段代码是C语言里结构体类型定义与指针变量声明的合并写法,拆解开来等价于两行代码:
// 第一步:定义struct node类型 struct node{ int info; struct node *next; }; // 第二步:声明一个指向struct node类型的指针变量start struct node *start;
在结构体定义的末尾(}之后)直接附加变量声明是C语言允许的语法。这里的*start就是声明了一个struct node*类型的指针变量,本质和单独声明指针变量没有区别,只是把类型定义和变量声明两步操作合并成了一行。
二、为什么start无需显式初始化就能作为node类型指针使用
要区分指针变量的类型属性和指针变量的取值:
- 指针变量的类型在声明时就已确定:
struct node *start;这句话明确告诉编译器,start是指向struct node类型的指针,这个类型属性从声明完成后就固定了,和有没有赋值(初始化)无关。 - 初始化是给指针变量赋值有效的内存地址(比如指向已分配的
struct node节点,或赋值NULL)。如果start是全局变量,C语言会默认将其初始化为NULL(空指针);如果是局部变量,它会是随机内存值(野指针)。但无论哪种情况,它的类型依然是struct node*,所以可以作为该类型指针使用——只是要注意,未初始化的局部指针(野指针)直接解引用会导致未定义行为,必须先赋值有效地址才能安全使用。
内容的提问来源于stack exchange,提问作者Veer Pratap
相关产品推荐
相关产品推荐

