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

Code::Blocks中CentralTendencies.exe运行崩溃求助(含统计计算C代码)

问题排查:栈溢出崩溃与类型转换验证

首先明确:你用到的类型转换语法(double)n/2是正确的。把int类型的n强制转换为double后再做除法,能保证除法运算为浮点数除法,之后用floor()取整再赋值给int变量m,这部分语法完全符合C标准,没有问题。

接下来看你遇到的崩溃问题:错误码0xC00000FD对应的是栈溢出(Stack Overflow),结合你的代码,主要有两个致命问题导致了崩溃:

1. 未初始化的可变长度数组(VLA)

你在代码开头定义了int n;之后直接写int a[n];,此时n是未初始化的局部变量,它的值是栈上的随机垃圾值。这会导致数组a被分配一个完全不确定的大小——如果随机值很大,栈空间会直接被耗尽,触发栈溢出崩溃;如果随机值无效,甚至会直接破坏栈结构。

C标准要求可变长度数组的大小必须是已初始化的、非负的整数表达式,所以必须先读取用户输入的n,再定义数组。

2. 排序循环的死循环

你写的排序嵌套循环存在严重错误:

int i=0;
for(i=0; i<n-1; i++) {for(i=0; i<n-1; i++) {
    if(a[i]>a[i+1]) {
        int temp = a[i+1];
        a[i+1] = a[i];
        a[i] = temp;
    }
}
}

外层和内层循环都使用了同一个循环变量i,内层循环每次都会把i重置为0并递增到n-1,这会导致外层循环永远无法正常退出,陷入无限死循环!程序一直卡在排序逻辑里,最终耗尽系统资源,触发进程终止的崩溃提示。

除了崩溃问题,你的代码还有几个逻辑错误需要修正:

  • 均值计算时,sum被放在循环内部初始化,每次循环都会重置为0,最终sum只会等于最后一个元素的值,均值计算完全错误;
  • 众数计算时,count未初始化,且每次匹配元素时都会重置count为0再自增,无法正确统计频率;同时b变量从未更新,无法跟踪当前最高频率。

修正后的完整代码

#include <stdio.h>
#include <math.h>

int main() {
    /*Inputs*/
    int n;
    float mean;
    int median;
    int mode;
    int count_max = 0; // 跟踪众数的最高频率

    printf("Enter the size of array: ");
    scanf("%d", &n);

    // 先读取n,再定义可变长度数组
    int a[n];

    for(int i=0; i<n; i++) {
        printf("\nEnter value %d: ", i+1);
        scanf("%d", &a[i]);
    }

    /* 冒泡排序(修正循环变量) */
    for(int i=0; i<n-1; i++) {
        // 内层循环用不同的变量j,避免和外层i冲突
        for(int j=0; j<n-1-i; j++) {
            if(a[j] > a[j+1]) {
                int temp = a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
            }
        }
    }

    /* 均值计算(将sum移到循环外初始化) */
    int sum = 0;
    for(int i=0; i<n; i++) {
        sum += a[i];
    }
    mean = (float)sum / n; // 这里也需要类型转换,避免整数除法丢失精度

    /* 中位数计算(你的类型转换是对的,保留) */
    int m = floor((double)n/2);
    if(n%2 == 0) {
        // 偶数个元素时,中位数可能是小数,建议把median改成float类型
        median = (a[m] + a[m-1]) / 2;
    } else {
        median = a[m];
    }

    /* 众数计算(修正频率统计逻辑) */
    mode = a[0]; // 默认第一个元素为众数
    for(int i=0; i<n; i++) {
        int count = 0;
        for(int t=0; t<n; t++) {
            if(a[i] == a[t]) {
                count++;
            }
        }
        if(count > count_max) {
            count_max = count;
            mode = a[i];
        }
    }

    printf("\nThe value of mean: %.2f", mean);
    printf("\nThe value of median: %d", median);
    printf("\nThe value of mode: %d", mode);

    return 0;
}

修正点说明

  1. 调整了数组定义的顺序,先读取用户输入的n,再定义int a[n],避免未初始化的VLA问题;
  2. 修正了冒泡排序的循环变量,内层使用j而非i,避免死循环;
  3. 把sum移到均值计算循环外初始化,确保能累计所有元素的和;
  4. 修正了众数的频率统计逻辑,初始化count_max跟踪最高频率,每次统计完当前元素的频率后更新众数;
  5. 均值计算时增加了(float)sum / n的类型转换,避免整数除法导致的精度丢失。

内容的提问来源于stack exchange,提问作者Md Arshad Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:11:23