C语言冒泡排序输出垃圾值与数组长度计算异常问题排查
问题修复说明
1. 数组长度计算错误
你计算数组长度的代码多嵌套了一层sizeof运算:
// 错误写法 size_t a_length = sizeof(sizeof(a)/sizeof(a[0]));
sizeof(a)/sizeof(a[0])本身已经是数组的元素个数数值,再套一层sizeof实际是求该数值的类型(size_t)占用的内存字节数。64位系统下size_t占8字节,所以无论数组实际长度是多少,你计算得到的长度都是8,这就是数组b计算得到长度为8而非7的直接原因。
修复方案:去掉外层sizeof即可:
// 正确写法 size_t a_length = sizeof(a)/sizeof(a[0]); size_t b_length = sizeof(b)/sizeof(b[0]);
2. 数组越界访问问题
代码中存在两处数组越界访问,这是输出垃圾值的核心原因:
- 排序循环逻辑错误:排序时的循环
for (int i = 0; i < len; i++)中,你会访问array[i+1],当i = len-1时,i+1 = len已经超出数组合法下标范围(数组下标范围为0 ~ len-1),会读取到数组外的内存数据。
修复方案:将循环条件改为i < len - 1 - 打印循环逻辑错误:打印的循环
for (int i = 0; i <= len; i++)中,<= len同样会访问到下标为len的非法内存。
修复方案:将循环条件改为i < len
修复后完整代码
#include <stdio.h> void bubbleSort(int array[], int len){ int temp; int counter = -1; printf("\n"); while(counter != 0){ counter = 0; // 修复循环边界 for (int i = 0; i < len - 1; i++) { if (array[i] > array[i + 1]){ temp = array[i + 1]; array[i + 1] = array[i]; array[i] = temp; counter++; } } } // 修复打印边界 for (int i = 0; i < len; i++) { printf("%i ", array[i]); } printf("\nBubble Sort Completed\n"); } int main(void){ int a[] = {1, 2, 4, 5, 7 ,6, 8, 3, 9}; int b[] = {10, 20, 40, 54, 23, 23, 12}; // 修复长度计算 size_t a_length = sizeof(a)/sizeof(a[0]); size_t b_length = sizeof(b)/sizeof(b[0]); bubbleSort(a, a_length); bubbleSort(b, b_length); return 0; }
内容的提问来源于stack exchange,提问作者David Huang
相关产品推荐
相关产品推荐

