You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递数组作为参数会导致段错误吗?附出错的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:32:30