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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:45:34