You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:54:08