c - 不确定为什么冒泡排序代码有分段错误
问题描述
嗨,我正在使用 gdb 调试我的冒泡排序代码,但我不明白为什么它一直在中断if(a[j] < a[j-1]
这是我的冒泡排序功能
void sort(int a[], int n) {
int i, j, nswaps, tmp;
for(i = 0; i < n; i++) {
nswaps = 0;
for(j = 0; j > i; j++) {
if(a[j] < a[j-1]) {
tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
nswaps++;
}
}
if(nswaps == 0) break;
}
}
请帮帮我谢谢!!
更新的代码:仍然有分段错误
void sort(int a[], int n) {
int i, j, nswaps;
for (i = 0; i < n; i++) {
nswaps = 0;
for (j = 1; j > i; j++) {
if (a[j] < a[j-1]) {
int tmp;
tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
nswaps++;
}
}
if (nswaps == 0) break;
}
}
解决方案
在外循环的第一次迭代中(当 的值为i
0 时),内循环变为无限循环,因为 的值j
从 0 开始并不断增加。最终j
变得足够大,您的程序可以访问一些未分配的内存,从而导致分段错误。
此外,在内部循环的第一次迭代中,值为j
0,因此a[j - 1]
将尝试访问超出程序范围的内存位置。
推荐阅读
- hibernate - javax.servlet.ServletException:无法在名称为“NA-dispatcher”的 servlet 中解析名称为“login”的视图
- perl - 通过逐行读取该文件来计算文件中字符串出现的次数并打印行数
- xcode - 上传了我的应用,但它在构建选项卡或活动选项卡中不可见
- javascript - 内容和条件的 Screen.width 问题
- python - 按对象类型拆分包含对象的python列表
- regex - 如何从字符串中提取键和值
- slf4j - 跟踪 ID 和其他跟踪信息未出现在日志中
- vue.js - 在 vuetify 的计算属性中使用渲染函数
- mysql - 将日期时间字段发布到 MySQL 表?
- php - 如何在 yii2 activeForm 中保存多个收音机的值?