为什么C++中指针判断条件写p != p+sz会触发段错误?
C++指针循环写法错误原因解析
对应问题代码如下:
#include<iostream> using std::cout; using std::endl; int main(){ int arr[] = {1,2,3,4,5}; int sz= (sizeof(arr)/sizeof(arr[0])); int *p = arr, *l = &arr[sz]; while(p != p+sz){ *p = 0; p++; } for(auto i: arr){ cout<<i<<endl; } return 0; }
核心错误原因
两种错误写法while(p != p+sz)、while(p < p+sz)的问题本质完全一致:
- 循环判断条件中的
p+sz会在每次循环执行判断时重新计算,而循环体内每次都会执行p++让指针p向后偏移,因此p+sz的值会随着p的增加同步变大,永远比当前的p大固定的sz步长,判断条件永远为真,程序会进入死循环。 - 死循环过程中p会不断超出数组的合法内存范围,访问未被进程授权的内存地址,最终触发
Segmentation fault (core dumped)段错误。
正确写法的逻辑
1. 预先计算尾指针的写法while(p != l)
变量l是在循环开始前就提前计算完成的固定值,指向数组的尾后地址&arr[sz],整个循环过程中l的值不会发生变化,p每次自增最终会和l相等,循环正常终止,只会访问数组的合法内存范围。
2. 判断条件中做指针加法的正确写法
并不是不能在循环判断条件中对指针做加法运算,只要加法的基地址是固定值即可,比如以下写法也是完全合法的:
while(p != arr + sz) // arr是固定的数组首地址,arr+sz是固定的尾后地址 // 或者用关系运算符 while(p < arr + sz)
内容的提问来源于stack exchange,提问作者Shubharthak
相关产品推荐
相关产品推荐

