C语言中把整型指针声明为普通整型变量为何会出现错误?
问题代码无法运行的核心原因
对应问题中的错误代码如下:
int p, a=12; p=&a; printf("value of a is : %d", *p );
代码无法正常运行的原因分为以下几点:
- 赋值阶段类型不匹配:
int p声明的p是普通整型变量,而&a是int *(整型指针)类型,二者属于完全不同的类型,直接赋值会触发编译警告甚至直接编译失败,不符合C语言的类型安全要求。 - 解引用操作非法:C语言中
*解引用运算符仅能作用于指针类型的变量,普通整型变量不支持解引用操作,编译器遇到*p时会直接报错,因为无法识别非指针类型变量的解引用语义。 - 地址宽度不匹配的隐患:就算通过强制类型转换强行绕过编译层面的类型校验,还会存在架构层面的兼容问题。比如在64位系统中,内存地址的宽度是8字节,而普通
int类型通常只有4字节,将8字节的地址存入4字节的int变量时会发生高位截断。哪怕示例中给出的地址1024刚好在4字节int的存储范围内不会被截断,这种写法也完全不符合C语言规范,属于未定义行为,在不同架构、不同编译器下的运行结果完全不可预期,大概率会读取到错误值,甚至触发段错误直接崩溃。
内容的提问来源于stack exchange,提问作者Athira Jayaram
相关产品推荐
相关产品推荐

