为何C语言中该for循环提前终止?两段指针代码差异解析
两段代码的差异与第一段循环提前终止的原因
核心差异
两段代码的核心区别仅在于for循环的增量语句:
- 第一段使用
*m++ - 第二段使用
i++
第一段循环提前终止的原因
问题出在*m++的执行逻辑上——C语言中后置++的优先级高于解引用*,所以这个表达式等价于*(m++),实际执行两个操作:
- 先将指针
m本身向后移动一个int类型的内存长度(指向变量i之后的未知内存区域); - 对
m原来指向的地址(即&i)解引用,但这个值会被直接丢弃,完全没有修改i的数值。
具体执行流程:
- 第一次循环:
- 初始化
m = &i,*m的值为5,满足<10的条件,执行printf输出5; - 执行
*m++,指针m移动到i之后的内存,i的数值仍为5。
- 初始化
- 第二次循环:
- 判断条件
*m <10:此时m指向未初始化的垃圾内存,本次运行中该内存的随机值恰好为5,满足条件,再次输出5; - 执行
*m++,指针m继续向后移动。
- 判断条件
- 第三次循环:
m指向的垃圾值大于等于10,条件不满足,循环直接终止。
而第二段代码用i++作为增量语句,每次循环都会修改i的数值,指针m始终指向i,因此*m能正确获取i的更新值,循环会从5执行到9,最后输出10,符合预期。
内容的提问来源于stack exchange,提问作者Kitan
相关产品推荐
相关产品推荐

