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
相关产品推荐
相关产品推荐

