使用指针比较时抛出异常,求数组降序排序解决方案
解决指针降序排序时的异常问题
作为刚接触指针的开发者,你遇到的大概率是指针越界访问或者非法指针比较的问题——这是新手用指针操作数组最容易踩的坑,我来一步步帮你理清:
常见错误原因(对应你的场景)
- 你可能在循环中让指针超出了数组的合法内存范围(比如数组是
int arr[5],你让指针跑到arr+6的位置,这时候访问或比较都会触发内存异常) - 指针比较逻辑搞混:把「指针地址的比较」当成了「指针指向元素值的比较」,完全偏离了排序需求
- 排序/打印循环的终止条件写错,导致指针越界访问非法内存
修正后的完整示例代码
假设你要处理的是int类型数组,我写一个用指针实现降序排序+指针打印的正确版本,你可以对照自己的代码找差异:
#include <stdio.h> #define ARR_SIZE 5 int main() { int arr[ARR_SIZE] = {3, 1, 4, 2, 5}; int *start = arr; int *end = arr + ARR_SIZE; // 数组末尾的下一个位置(安全的终止边界) // 指针实现降序选择排序 for (int *p = start; p < end - 1; p++) { int *max_ptr = p; // 遍历找当前区间的最大值指针 for (int *q = p + 1; q < end; q++) { if (*q > *max_ptr) { // 重点:比较指针指向的元素值,不是指针地址 max_ptr = q; } } // 交换当前元素和最大值元素 int temp = *p; *p = *max_ptr; *max_ptr = temp; } // 用指针打印所有元素的测试循环 printf("降序排序后的数组:"); for (int *p = start; p < end; p++) { printf("%d ", *p); } printf("\n"); return 0; }
关键细节拆解(针对你可能出错的点)
指针边界的正确定义:
- 数组的合法元素范围是
arr[0]到arr[ARR_SIZE-1],对应指针是arr到arr+ARR_SIZE-1 - 我们用
arr+ARR_SIZE作为终止边界(这个指针不指向任何合法元素,但用来判断循环终止是安全的) - 如果你的循环让指针超过这个边界,就会访问非法内存,直接触发异常
- 数组的合法元素范围是
指针比较的正确姿势:
- 排序需要比较的是指针指向的元素值(比如
*q > *max_ptr),而不是指针本身的内存地址(q > max_ptr是在比地址大小,和排序无关) - 这是新手用指针排序最容易犯的错误,也是你抛出异常的核心原因之一
- 排序需要比较的是指针指向的元素值(比如
打印循环的终止条件:
- 打印时循环必须以
p < end为终止条件,如果写成p <= end,就会访问arr+ARR_SIZE指向的非法内存,触发异常
- 打印时循环必须以
快速排查你代码的步骤
- 先检查数组边界指针:有没有用「数组名 + 数组长度」作为循环的终止边界?
- 检查排序循环中的比较逻辑:是在比较
*指针(元素值)还是指针(地址)? - 检查所有循环的终止条件:有没有让指针超出数组的合法范围?
内容的提问来源于stack exchange,提问作者NinjaBryden
相关产品推荐
相关产品推荐

