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

C语言给指针赋值硬编码地址为何编译器允许且程序不崩溃?

代码可编译且运行不崩溃的核心原因
  • C语言的底层设计特性允许整数到指针的隐式转换
    C作为系统级开发语言,原生支持开发者直接操作内存地址,默认编译规则下仅会对整数直接赋值给指针的操作输出类型转换警告,不会直接阻断编译。只有开启-Werror类严格编译选项时,才会把这类类型不匹配操作判定为编译错误。嵌入式开发场景中经常需要直接给固定硬件寄存器的硬编码地址赋值,这种语法就是为这类场景设计的。另外你这段代码使用的是老式C语法,没有严格的函数返回值、参数声明,编译器默认兼容旧C标准,也进一步降低了编译拦截的门槛。
  • 运行不崩溃的核心原因是没有对指针做解引用操作
    你给出的代码仅执行了两个合法操作:把整数10作为地址值存入指针变量p、打印p本身存储的地址值。这两个操作都只是操作指针变量本身的栈存储空间,完全没有访问p指向的0xA地址的内存,自然不会触发操作系统的内存访问权限校验,也就不会出现段错误。如果在代码中新增*p = 100;这类解引用访问操作,进程会立即因为访问操作系统预留的低地址内存触发崩溃。
  • 关于逻辑地址分配的误解补充
    你理解的“逻辑地址由编译器分配”,指的是指针变量p本身在栈上的存储地址是编译器/运行时分配的,而p内部存储的地址值属于用户完全可控的内容,编译器不会做额外限制,仅在语法层面做最小程度的类型校验。

内容的提问来源于stack exchange,提问作者myquest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:18:03