You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段C代码输出地址值?添加-pedantic-errors编译选项会报错

关于这段C代码的行为与编译问题解析

先把你提到的代码贴出来,方便咱们分析:

int i,*ip; 
main() { 
    i=5; 
    ip=&i; 
    *ip=&ip;
    printf("%d",i); 
}

咱们分几个部分来聊:

1. 普通编译下的运行行为

你观察到的输出类似635435的数值,确实是ip变量的地址,原因是这段代码里的*ip=&ip做了一个不安全的隐式类型转换:

  • *ip是int类型(因为ip是int*,解引用后对应int类型的变量i)
  • &ip是int**类型(指向指针的指针,也就是ip这个变量本身在内存中的地址)
  • 编译器默认允许把指针类型隐式转换成整数类型(这里是int),于是ip的地址数值被赋值给了*ip——而*ip本质就是i(因为ip=&i),所以最后printf("%d",i)打印的就是ip变量的地址值。

2. 为什么普通编译无报错

C语言的标准允许一些不严格的隐式转换,虽然这种指针转整数的操作非常不安全,但编译器默认只会发出警告(如果你打开-Wall选项,应该能看到类似“assignment to 'int' from 'int **' makes integer from pointer without a cast”的警告),不会直接报错,所以代码能正常编译并运行。

3. 为什么-pedantic-errors会触发错误

-pedantic-errors是一个让编译器严格遵循C标准的编译标志,它会把所有不符合标准的代码都当成错误处理,而不是警告。根据C标准,指针类型(除了void*转字符指针这类特例)不能隐式转换成非指针的算术类型(比如int),所以*ip=&ip这个赋值操作违反了标准,编译器就会直接抛出错误,阻止编译。

总结一下:普通编译下代码会运行并输出ip变量的地址值;使用-pedantic-errors时,因为违反C标准的隐式转换,会触发编译错误。

内容的提问来源于stack exchange,提问作者no one ever

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:12:27