数组未找到目标元素时while循环执行问题及快排优化疑问
问题一:数组未找到目标元素时while循环的执行行为
给出代码示例:
int arr[] = {1,2,3,4,5}; int i = 0; while(arr[i]<=6){ i++; }
当数组中没有大于6的元素时,这个循环不会在数组末尾自动停止,也不一定会无限递增:
- 数组
arr的有效下标是0到4(共5个元素),当i递增到5时,arr[5]属于数组越界访问,这部分内存的内容是未定义的(可能是随机值,也可能是其他变量的内容)。 - 如果越界后访问到的内存值仍然
<=6,i会继续递增;如果某次访问到的值>6,循环会停止;但更可能的情况是,越界访问到了程序不允许操作的内存区域,直接触发**段错误(Segmentation Fault)**导致程序崩溃。 - C语言不会自动检查数组下标是否越界,不存在“自动在数组末尾停止”的机制。
问题二:快速排序partition函数的越界问题
原partition函数中的这段循环:
while (arr[i] <= pivot) { i++; }
当遍历到数组末尾仍未找到大于pivot的元素时,i会一直递增到high + 1,此时访问arr[i]属于数组越界访问,会触发未定义行为(可能导致程序崩溃、排序结果错误等)。
必须添加i<=high的条件,修改后的循环应为:
while (arr[i] <= pivot && i <= high) { i++; }
原因是:
- 添加
i<=high后,i的最大值只会到high,确保始终访问数组的有效下标范围(low到high)。 - 当所有元素都小于等于pivot时,
i最终会变成high+1,但此时循环条件i<=high不满足,循环停止,后续代码不再访问arr[i],不会触发越界问题。
内容的提问来源于stack exchange,提问作者Mohammad Qasim
相关产品推荐
相关产品推荐

