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; }
修正点说明
- 调整了数组定义的顺序,先读取用户输入的
n,再定义int a[n],避免未初始化的VLA问题; - 修正了冒泡排序的循环变量,内层使用
j而非i,避免死循环; - 把
sum移到均值计算循环外初始化,确保能累计所有元素的和; - 修正了众数的频率统计逻辑,初始化
count_max跟踪最高频率,每次统计完当前元素的频率后更新众数; - 均值计算时增加了
(float)sum / n的类型转换,避免整数除法导致的精度丢失。
内容的提问来源于stack exchange,提问作者Md Arshad Ali
相关产品推荐
相关产品推荐

