冒泡排序运行异常:出现Segmentation Error(段错误)求助
解决冒泡排序的Segmentation Error(段错误)问题
嘿,我太懂你折腾一小时还没搞定段错误的抓狂感了!先别慌,段错误90%以上都是内存越界访问搞的鬼,咱们结合你的代码片段一步步排查。
首先你的代码里初始化数组的循环写了一半(for (i = ...),先假设你是想生成N个随机数,先从最可能出错的地方说起:
1. 数组初始化时的下标越界
如果你的初始化循环写成了for (i = 0; i <= N; i++),那可就麻烦了——数组a的下标范围是0~9(因为#define N 10),访问a[10]直接超出了数组的内存范围,触发段错误。正确的初始化应该是:
for (i = 0; i < N; i++) { a[i] = rand() % 100; // 生成0-99的随机数,你可以调整范围 }
2. 冒泡排序函数的循环边界错误
这是冒泡排序触发段错误的重灾区!如果你的sort函数里循环边界写错,比如内层循环的条件是j <= n - i -1,那j+1就会等于n,访问arr[n]直接越界。给你一个正确的冒泡排序实现参考:
void sort(int arr[], int n) { int i, j, temp; // 外层循环只需要n-1次,因为最后一个元素会自动归位 for (i = 0; i < n - 1; i++) { // 内层循环每次减少i+1次,因为末尾i个元素已经是有序的了 for (j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } }
3. show函数的潜在越界问题
如果你的show函数遍历数组时用了i <= n而不是i < n,同样会访问到超出数组范围的元素。正确的show函数示例:
void show(char *msg, int arr[], int n) { printf("%s: ", msg); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); }
完整可运行代码
把这些修正点整合起来,你可以直接运行这段代码对比自己的实现:
#include <stdio.h> #include <stdlib.h> #define N 10 void sort(int [], int); void show(char *, int [], int); int main(void) { int i, j, a[N]; srand(0); for (j = 1; j <= 5; j++) { // 正确初始化数组 for (i = 0; i < N; i++) { a[i] = rand() % 100; } show("排序前", a, N); sort(a, N); show("排序后", a, N); printf("---\n"); } return 0; } void sort(int arr[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } void show(char *msg, int arr[], int n) { printf("%s: ", msg); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); }
最后再提醒一句:排查段错误时,重点盯着所有数组下标的范围,确保每一次访问都在0~n-1之间(n是数组长度),大部分问题都能迎刃而解。
内容的提问来源于stack exchange,提问作者Harris
相关产品推荐
相关产品推荐

