指针问题排查:数组最值无法输出的原因及指针设置疑问
问题根源分析
- 核心错误:
main函数中的maxPtr和minPtr是未初始化的野指针,它们没有指向任何有效的内存地址。当MaxAndMin函数执行**max = arr[0]这类操作时,本质是对一块随机内存地址进行写操作,触发C语言的未定义行为——程序会直接崩溃、输出乱码,或像你遇到的那样提前终止,根本执行不到最后的打印语句。
修正方案
方案1:贴合原有逻辑的修正
给指针分配有效内存,让它们指向实际存储结果的变量:
#include <stdio.h> void MaxAndMin(int* arr, int** max, int** min) { int i; **max = **min = arr[0]; for (i = 1; i < 5; i++) { if (**max < arr[i]) { **max = arr[i]; } } for (i = 1; i < 5; i++) { if (**min > arr[i]) { **min = arr[i]; } } } int main(void) { int maxVal, minVal; // 定义存储结果的实际变量 int* maxPtr = &maxVal; // 让指针指向有效内存 int* minPtr = &minVal; int arr[5]; int i; for (i = 0; i < 5; i++) { printf("입력:"); scanf("%d", &arr[i]); printf("\n"); } MaxAndMin(arr, &maxPtr, &minPtr); printf("%d %d", *maxPtr, *minPtr); return 0; }
方案2:简化指针逻辑(更简洁易读)
不需要使用二级指针,直接让函数接收存储结果的变量地址,避免野指针风险:
#include <stdio.h> void MaxAndMin(int* arr, int* max, int* min) { int i; *max = *min = arr[0]; // 合并循环,减少遍历次数 for (i = 1; i < 5; i++) { if (*max < arr[i]) *max = arr[i]; if (*min > arr[i]) *min = arr[i]; } } int main(void) { int maxVal, minVal; int arr[5]; int i; for (i = 0; i < 5; i++) { printf("입력:"); scanf("%d", &arr[i]); printf("\n"); } MaxAndMin(arr, &maxVal, &minVal); printf("%d %d", maxVal, minVal); return 0; }
额外优化建议
- 把数组长度定义为宏(比如
#define ARR_LEN 5),避免代码中硬写数字,方便后续修改; - 合并查找最大值和最小值的循环,减少一次数组遍历,提升效率。
内容的提问来源于stack exchange,提问作者seohyung
相关产品推荐
相关产品推荐

