求助排查C++测试分数处理程序编译报错,需实现分数排序、展示与平均分计算
代码编译报错核心原因
- 函数签名不匹配是导致编译失败的根本问题。前置声明中
sortArr的参数定义为int [], int,即接收整型数组(退化为一级int*指针)、数组长度两个参数;但函数实际实现时的参数写为int *arr[], int SIZE,此处的arr是存储int*指针的数组(即二级int**类型),和传入的一级指针类型完全不兼容,编译器会直接报类型转换错误,无法通过编译。 - 函数内部逻辑和参数类型错配。因为错误把数组定义成了二级指针,函数内部所有取值、比较、交换操作都是按二级指针逻辑编写的,比如
*(arr[index])、minElem = arr[startScan]这类操作,哪怕跳过编译检查,运行时也会出现非法内存访问。 - 动态内存未释放。
main函数中通过new int[size]申请的堆内存,在程序结束前没有配套执行delete[] scorePtr;,存在内存泄漏隐患。
具体修改步骤
- 修正
sortArr函数的定义签名,和前置声明保持一致,将参数从int *arr[]改为int arr[],对应函数内部的选择排序逻辑从二级指针操作改为普通整型数组操作:
void sortArr(int arr[], int SIZE) { int startScan, minIndex, minValue; for(startScan = 0; startScan < (SIZE - 1); startScan++) { minIndex = startScan; minValue = arr[startScan]; for(int index = startScan + 1; index < SIZE; index++) { if(arr[index] < minValue) { minValue = arr[index]; minIndex = index; } } // 交换位置存储最小值 arr[minIndex] = arr[startScan]; arr[startScan] = minValue; } cout << "Here are the scores you entered, sorted in ascending order: " << endl; for(int count = 0; count < SIZE; count++) cout << arr[count] << " "; cout << endl; }
- 在
main函数的getAvg(scorePtr, size);调用完成后、return 0;之前,增加内存释放语句:delete[] scorePtr; - (可选优化)输入校验逻辑增加对非数字输入的判断,避免用户输入非法字符时程序进入无限死循环。
内容的提问来源于stack exchange,提问作者carl rob
相关产品推荐
相关产品推荐

