为何外部指针会引发编译错误?两段C代码差异解析
两段C代码的编译差异问题分析
第一段错误代码
#include<stdio.h> int *a,b=9; a=&b; void main() { //nothing here }
编译报错信息
- [警告] 数据定义无类型或存储类
- [警告] 声明'a'时默认类型为'int' [-Wimplicit-int]
- [错误] 'a'的类型冲突
- [说明] 'a'的先前定义在此处
- [警告] 从'int *'初始化'int'时未进行强制转换,将指针转换为整数 [-Wint-conversion]
问题拆解
1. 全局域不能放执行语句
C语言规定,全局作用域里只能写变量的声明或定义,不能写赋值这类执行语句。你把a=&b;放在全局区域,编译器根本不会把它当成赋值操作,反而会误判成一个新的变量声明——因为这条语句没有指定类型,所以触发了“无类型或存储类”的警告,同时按照C的旧规则默认把这个a当成int类型。
2. 重名变量的类型冲突
第一行的int *a,b=9;已经定义了a是int*类型的指针,而后面被误判的a=&b;相当于重新声明了一个int类型的a,还试图用b的地址(指针类型)给它初始化,这就导致了两个问题:一是同一个名字的变量类型冲突,二是指针转整数的类型不匹配警告。
第二段正确代码
#include<stdio.h> void main() { int *a,b=9; a=&b; }
这段代码能编译通过,核心原因就是把赋值语句a=&b;放到了main函数内部的局部作用域。函数内部是执行代码的合法区域,编译器会正确识别这是给之前定义的int* a赋值,不会当成新的变量声明,自然就没有冲突了。
内容的提问来源于stack exchange,提问作者World Producer
相关产品推荐
相关产品推荐

