为何这段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
相关产品推荐
相关产品推荐

