为何C语言(Visual Studio)中int*赋值int可编译运行?
为什么Visual Studio中这段代码的
foo = *baz;能编译运行? 核心原因
这是因为Visual Studio的C编译器(MSVC)默认遵循C89标准的隐式转换规则,且默认未开启严格类型检查,具体拆解如下:
*baz的本质:baz是指向x的指针,*baz取到的是x的整数值6,属于int类型。- C89的规则:C89标准允许整数类型与指针类型之间进行隐式转换,这种转换属于「实现定义行为」——MSVC会直接把整数值当作内存地址来处理,比如这里的6会被转换成地址
0x00000006赋值给foo。 - 编译设置的影响:Visual Studio默认没有开启
/W4(最高级别警告)或/WX(警告视为错误)这类严格检查选项,所以这种类型不匹配的操作只会触发警告(比如C4047),不会中断编译流程。
注意事项
虽然这段代码能编译运行,但属于严重的错误写法:把整数当作指针地址赋值后,后续如果解引用foo(比如*foo),会访问非法内存地址,大概率直接导致程序崩溃,或引发不可预测的行为。
内容的提问来源于stack exchange,提问作者user6175293
相关产品推荐
相关产品推荐

