C语言char类型指针两种赋值写法的差异与编译报错原因咨询
两段C指针代码的原理差异讲解
核心前置概念
C语言中*符号在不同场景下语义完全不同:
- 变量声明阶段,
*属于类型说明符的一部分,标识当前声明的变量为指针类型 - 非声明的执行语句中,
*是解引用操作符,含义是取指针指向的内存空间中存储的值
第一段代码解析
char c = 'a'; char *p = &c;
这是合法的指针初始化逻辑:
- 第二行属于变量声明+初始化语句,此处的
*和char结合,说明p的类型是char*(字符指针) - 整行逻辑是:声明字符指针变量
p,同时将变量c的内存地址(&c的计算结果)直接赋值给指针变量p本身,完全符合C语言语法规则,运行正常。
第二段代码解析
char c = 'a'; char *p; *p = &c;
这段代码存在两层错误:
- 编译阶段的类型不匹配错误
当执行到*p = &c时,p已经完成了声明,此处的*是解引用操作符:
- 左值
*p的含义是p指向的内存空间中存储的值,类型为char - 右值
&c是变量c的内存地址,类型为char*(指针类型)
两种类型完全不匹配,因此编译阶段就会直接报错。
- 即便通过强制类型转换消去编译告警,依然存在运行时崩溃风险
你在声明char *p之后没有给p赋值,此时p是野指针,指向的内存地址是随机、未申请的非法地址,直接对*p赋值属于非法内存访问,运行时会直接触发段错误。
内容的提问来源于stack exchange,提问作者user14793744
相关产品推荐
相关产品推荐

