传递数组作为参数会导致段错误吗?附出错的C语言数组最值代码
程序错误分析与修复
当前版本(段错误)的问题与修复
错误点
- 数组定义时机错误:在读取数组大小
n之前就定义了int array[n];,此时全局变量n未初始化,值为随机数,导致数组大小非法,后续操作极易触发内存越界。 - 输入元素地址错误:
scanf("%d", array);始终将输入写入数组首元素地址,所有输入都会覆盖第一个元素,且其他元素未初始化。正确写法应为scanf("%d", &array[i]);,将每个输入写入对应索引的元素地址。 - 函数调用参数错误:
minimum(array[n]);传递的是数组第n个元素(索引越界,数组有效索引为0~n-1),而函数需要的是数组首地址,应传递array或&array[0]。 - 函数声明不匹配:
void minimum();无参数声明,但函数定义带有参数,导致调用时类型不匹配,触发未定义行为。
修复后的当前版本代码
#include <stdio.h> // 函数声明匹配定义 void minimum(int arr[], int n); void maximum(int arr[], int n); int main() { int n; printf("Enter the size of your array:\n"); // 先读取数组大小,再定义数组 scanf("%d", &n); int array[n]; printf("Enter the elements of your array:\n"); for (int i = 0; i < n; i++) { printf("Enter element %d:\n", i + 1); // 写入对应索引的元素地址 scanf("%d", &array[i]); } // 传递数组首地址和大小 minimum(array, n); maximum(array, n); return 0; } void minimum(int arr[], int n) { // 用普通变量存储最小值,而非修改数组元素 int min = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < min) { min = arr[i]; } } printf("The smallest element in the array is: %d\n", min); } void maximum(int arr[], int n) { // 用普通变量存储最大值,而非修改数组元素 int max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } } printf("The greatest element in the array is: %d\n", max); }
早期版本(输出0)的问题与修复
错误点
- 输入元素地址错误:与当前版本相同,
scanf("%d", array);始终覆盖数组首元素,其他元素为未初始化的随机值。 - 最值逻辑错误:使用指针
int *min = &arr[0];并通过*min = *(arr+i);修改数组首元素,而非用变量记录最值。未初始化的随机值可能包含0,导致最终输出0。
修复后的早期版本代码
#include <stdio.h> void minimum(int *, int); void maximum(int *, int); int main() { int n; int array[100]; printf("Enter the size of your array:\n"); scanf("%d", &n); printf("Enter the elements of your array:\n"); for (int i = 0; i < n; i++) { printf("Enter element %d:\n", i + 1); // 写入对应索引的元素地址 scanf("%d", &array[i]); } minimum(array, n); maximum(array, n); return 0; } void minimum(int *arr, int n) { // 用变量存储最小值,避免修改数组 int min = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < min) { min = arr[i]; } } printf("The smallest element in the array is: %d\n", min); } void maximum(int *arr, int n) { // 用变量存储最大值,避免修改数组 int max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) { max = arr[i]; } } printf("The greatest element in the array is: %d\n", max); }
内容的提问来源于stack exchange,提问作者Varun G
相关产品推荐
相关产品推荐

