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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 05:24:04