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

C语言中指针p指向q的地址后对*p赋值10会产生什么结果

代码运行行为说明

对应代码如下:

int *p, *q = malloc(4);
p = &q;
*p = 10;
  • 编译阶段首先会触发类型不匹配问题:p定义为int*类型(指向整型的指针),但&q的实际类型是int**(指向整型指针的指针),二者类型不兼容,正常开启编译警告时会明确提示,配置了严格编译规则的环境下会直接阻断编译,无法生成可执行程序。
  • 如果强行忽略编译警告运行代码,执行*p = 10时根本不会操作malloc申请的那块4字节堆内存:p存储的是指针变量q自身在栈上的内存地址,不是q保存的堆块地址,这行代码的实际效果是直接把q存储的地址值改写为整数10,让q指向内存地址为10的位置。
  • 代码运行后会直接产生两个确定的问题:
    • 之前malloc申请的4字节堆内存丢失了唯一的引用地址,后续无法再被访问或释放,直接造成堆内存泄漏。
    • 地址10属于操作系统预留的低地址保护区,普通用户态程序没有读写权限,只要后续代码尝试解引用q操作该地址,会立刻触发段错误(Segmentation Fault),程序直接崩溃。
  • 如果原本的需求是给malloc申请的堆内存写入数值10,正确写法是直接操作q指向的地址:*q = 10;。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:15:27