C++用指针代替衰变数组名引发段错误的原因是什么?
问题原因说明
问题和数组名的指针衰变规则无关,核心错误是你在循环终止条件的边界计算中使用了随循环自增的变量ptr_c:
- 原始代码的终止条件为
ptr_c != (ptr_c + std::size(name)):对于任意有效的指针值,ptr_c + 正整数得到的地址永远高于当前ptr_c的地址,这个判断条件永远不可能成立,会导致循环无限执行。ptr_c持续向后偏移,越界访问不属于程序合法权限的内存空间,最终触发段错误。 - 替换为数组名
name后,终止条件变为ptr_c != (name + std::size(name)):name作为数组名衰变为指针后,值是固定的数组首地址,因此name + std::size(name)是一个固定值,对应数组末尾之后的第一个地址。每次循环ptr_c自增1,当偏移到这个固定地址时循环就会终止,不会出现越界访问,因此运行正常。
关于你提到的数组名衰变规则的疑问:你说的规则是正确的,数组名确实会自动衰变为和ptr_c同类型的指针,但衰变得到的是值固定的右值指针常量,和你定义的可修改的左值指针变量ptr_c的可变性完全不同,这才是两个写法运行结果不同的核心原因。
内容的提问来源于stack exchange,提问作者Abhinav Jha
相关产品推荐
相关产品推荐

