为何输入一个数后C程序即终止?能否用该逻辑求最值?
问题分析与解决方案
程序崩溃的核心原因
你的程序输入一个数字就终止,是因为指针p未初始化——它指向的是内存中的随机非法地址,当你通过scanf("%d",(p+i))往这个地址写入数据时,触发了非法内存访问,直接导致程序崩溃。
能否用此逻辑求解任意数量数字的最值?
可以,但必须先修复指针的内存指向问题,让它拥有合法的内存空间。下面是两种可行的修正方案:
方案1:动态内存分配(适配任意C标准)
通过malloc为指针分配对应大小的内存,用完后记得释放:
#include<stdio.h> #include<stdlib.h> // 引入malloc/free的头文件 int main() // 标准C中main的返回类型应为int,而非void { int *p, n, i, max, min; printf("How many numbers?= "); scanf("%d", &n); // 分配能存储n个int的内存 p = (int*)malloc(n * sizeof(int)); if (p == NULL) { // 检查内存分配是否成功 printf("内存分配失败\n"); return 1; } printf("\nStart entering numbers\n"); for(i=0; i<n; i++){ scanf("%d", (p+i)); } max = *(p+0); for(i=0; i<n; i++){ if(*(p+i) > max) max = *(p+i); } printf("Maximum number = %d\n", max); min = *(p+0); for(i=0; i<n; i++){ if(*(p+i) < min) min = *(p+i); } printf("Minimum number = %d", min); free(p); // 释放动态分配的内存 return 0; }
方案2:可变长度数组(C99及以上标准支持)
直接使用由用户输入的n决定大小的数组,无需手动管理内存:
#include<stdio.h> int main() { int n, i, max, min; printf("How many numbers?= "); scanf("%d", &n); int arr[n]; // 可变长度数组,大小由n动态决定 printf("\nStart entering numbers\n"); for(i=0; i<n; i++){ scanf("%d", &arr[i]); } max = arr[0]; for(i=0; i<n; i++){ if(arr[i] > max) max = arr[i]; } printf("Maximum number = %d\n", max); min = arr[0]; for(i=0; i<n; i++){ if(arr[i] < min) min = arr[i]; } printf("Minimum number = %d", min); return 0; }
额外优化建议
可以在输入数字的同时同步更新最大值和最小值,减少一次遍历操作:
#include<stdio.h> #include<stdlib.h> int main() { int *p, n, i, max, min; printf("How many numbers?= "); scanf("%d", &n); p = (int*)malloc(n * sizeof(int)); if (p == NULL) { printf("内存分配失败\n"); return 1; } printf("\nStart entering numbers\n"); // 输入第一个数时直接初始化max和min scanf("%d", p); max = min = *p; for(i=1; i<n; i++){ scanf("%d", (p+i)); if(*(p+i) > max) max = *(p+i); if(*(p+i) < min) min = *(p+i); } printf("Maximum number = %d\n", max); printf("Minimum number = %d", min); free(p); return 0; }
内容的提问来源于stack exchange,提问作者Niraj Regmi
相关产品推荐
相关产品推荐

