C语言初始for循环未达指定次数,请求排查问题原因
问题排查与修复方案
首先导致第一个for循环异常终止的核心问题是**scanf的参数错误**,后续代码还存在数组越界、逻辑错误等问题,逐一拆解如下:
1. scanf参数错误(直接引发循环异常)
第一个循环里的scanf("%d", array[i]);写法错误:scanf读取整数时需要传入变量的内存地址,而array[i]是数组元素的具体值,并非地址。这会导致scanf往非法内存地址写入数据,触发未定义行为,直接让循环提前终止。
修复方式:将参数改为&array[i],正确代码:
scanf("%d", &array[i]);
2. 冒泡排序的交换逻辑错误
冒泡排序的交换代码最后一步逻辑错误,array[j] = array[j-1];会把已经被覆盖的array[j-1]值(等于原array[j])赋值给array[j],等于没完成交换。
错误代码段:
k=array[j-1]; array[j-1]=array[j]; array[j]=array[j-1]; // 此处错误
修复后:
k = array[j-1]; array[j-1] = array[j]; array[j] = k; // 用临时变量k保存的原值赋值
3. 数组越界问题
- 冒泡排序内层循环起始值
j=10错误:数组array的下标范围是0~9(因为size=10),array[10]属于越界访问,会读取/修改非法内存,起始值应改为size-1(即9)。 - 后续判断
if(array[i]=array[i+1])中,当i=9时,array[i+1]是array[10],同样越界,循环条件应改为i < size-1。
4. 条件判断误用赋值运算符
if(array[i]=array[i+1])里用了赋值运算符=,而非比较运算符==,这会把array[i+1]的值赋给array[i],再判断赋值结果是否非零,完全偏离了“判断相邻元素是否相等”的逻辑。
修复方式:改为if(array[i] == array[i+1])
修复后的完整代码
#include <stdio.h> #define size 10 int main(int argc, char *argv[]){ int array[size],sum[size],k,sum1,i,j; sum1=0; printf("give 10 integers:\n"); for(i=0; i<size; i++){ scanf("%d", &array[i]); sum[i]=0; } for(i=0; i<size-1; i++){ for(j=size-1; j>i; j--){ if(array[j-1]>array[j]){ k=array[j-1]; array[j-1]=array[j]; array[j]=k; } } } for(i=0; i<size-1; i++){ if(array[i] == array[i+1]) sum[i]=sum[i]+1; } for(i=0; i<size; i++){ sum1=sum1+sum[i]; } printf("%d", sum1); return 0; }
内容的提问来源于stack exchange,提问作者Alchazov
相关产品推荐
相关产品推荐

