以下代码中的错误是什么?

时间:2015-09-03 05:39:00

标签: c arrays

在运行时,max从数字列表中给出所需的最大数量,但是min没有给出它应该给出的最小数量。 例如:

如果输入为:

  

5
  45 7 2 1 4

以下代码的输出是:

  

最大数量为45

     

最小数量为0

为什么?

#include <stdio.h>
#include <limits.h>
#define MX 1000000

int max=INT_MIN;
int min=INT_MAX;

int findmax(int a[],int n)
{
    if(n<0)
        return max;
    if(a[n]>max)
    {
        max=a[n];
    }
    return findmax(a,n-1);
}

int findmin(int a[],int n)
{
    if(n<0)
        return min;
    if(a[n]<min)
    {
        min=a[n];
    }
    return findmin(a,n-1);
}

int main(void) {
    int a[MX],n,i;
    printf("Enter the number of elements:\n");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("Maximum number is %d\n",findmax(a,n));
    printf("Minimum number is %d\n",findmin(a,n));
    return 0;
}

3 个答案:

答案 0 :(得分:5)

在您的代码中,您将索引0的值初始化为n-1,但在findmax()findmin()内,你是&#39 ;重新使用索引n。该值未初始化为任何值(a是自动局部变量,还记得吗?),以及该指数(内容)中的值是不确定的。

因此,使用该索引访问实际上是尝试读取调用undefined behaviour的单元化变量。

findmax()作为第二个参数拨打findmin()n-1

答案 1 :(得分:0)

您需要从n-1而不是从n迭代数组元素。因此,以这种方式调用函数 findmax(a,n-1) findmin(a,n-1)

答案 2 :(得分:0)

使用全局变量不被认为是一个好的设计。如果您不痴迷于递归函数,可以将代码简化为

int findmax(int a[], int n) {
    int i = 0, max = INT_MIN;
    for (; i < n; ++i)
        if (max < a[i])
            max = a[i];
    return max;
}

同样适用于findmin