C语言代码排查:用户输入数组大小后程序异常求助
C语言代码问题排查:用户输入数组大小时程序异常的原因及修复
核心错误
你代码里的致命问题是在变量x未初始化时,就用它定义了变长数组array[x]。
在main函数里,你先声明了int x;,紧接着就写了int array[x];——这时候x还没被用户输入赋值,内存里是随机的垃圾值,数组的实际大小就是这个随机数。等你用scanf读取用户输入的x后,数组的大小并不会自动更新。如果用户输入的x比这个随机大小大,后续往数组里写元素时就会越界访问内存,破坏程序的运行环境,导致各种异常行为。而如果在程序内部提前给x赋值,x在定义数组时已经有确定的有效值,所以程序能正常运行。
修复步骤
- 调整数组定义的位置:把
int array[x];移到scanf("%d", &x);之后,确保x有了用户输入的确定值再创建数组。 - 可选优化:冒泡排序效率提升:你的冒泡排序内层循环可以改成
j < x-1 -i,因为每一轮排序都会把当前最大的元素放到数组末尾,已经排好的部分不需要再重复比较,能减少不必要的循环次数。 - 可选优化:输入合法性检查:可以判断
scanf的返回值,确保用户输入的是有效的正整数,避免非法输入导致的问题。
修复后的完整代码
#include <stdio.h> #include <string.h> void sorting( int array[], int x){ for (int i = 0; i < x-1; i++) { // 内层循环优化:跳过已经排好的末尾i个元素 for (int j = 0; j < x-1 -i; j++) { if (array[j] > array[j+1]) { int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } } void printing(int array[],int x) { printf("\n排序后的数组:\n"); for (int i = 0; i < x; i++) { printf("%d, ", array[i]); } } int main(){ int x; printf("请输入数组的大小(正整数):\n"); // 检查输入是否有效 if (scanf("%d", &x) != 1 || x <= 0) { printf("输入无效,请输入正整数!\n"); return 1; } // 现在x有确定值,再定义数组 int array[x]; printf("请输入%d个整数:\n", x); for (int i = 0; i < x; i++) { printf("输入第%d个数:\n", i+1); if (scanf("%d", &array[i]) != 1) { printf("输入无效,请输入整数!\n"); return 1; } } printf("你输入的数组是:\n"); for (int i = 0; i < x; i++) { printf("%d, ", array[i]); } sorting(array, x); printing(array, x); return 0; }
内容的提问来源于stack exchange,提问作者M-A-K Tech
相关产品推荐
相关产品推荐

