函数中错误的最小和最大分配

False min and max assignments in function

我有一个函数应该使用结构在数组中找到最小值和最大值。 但不知何故,该函数将错误的值分配给最小和最大变量。有人可以解释我哪里有错误吗?非常感谢你。 P.S。在我的作业中,函数不需要取数组的第一个元素

min_max_t min_max(unsigned int *array, int size)
{
    min_max_t flag;
    flag.min = array[1];
    flag.max = array[1];
    printf("Flag.min: %d | ", flag.min);
    printf("Flag.max: %d\n", flag.max);
    for (int i = 1; i < size; i++)
    {
        printf("i = %d - [A:%d - Min:%d - Max:%d]\n", i, array[i], flag.min, flag.max);
        if(array[i] > flag.max)
        {
            flag.max = array[i];
        }
        else if (array[i] < flag.min)
        {
            flag.min = array[i];
        }
        printf("i = %d - [A:%d - Min:%d - Max:%d]\n\n", i, array[i], flag.min, flag.max);
    }
    return flag;
}

Screenshot of function process

对于初学者来说,函数应该这样声明

min_max_t min_max( const unsigned int *array, size_t size );

和结构 min_max_t 应该包含两个数据成员,它们将存储索引到最小和最大元素。例如

typedef struct min_max_t
{
    size_t min;
    size_t max;
} min_max_t;

否则,当用户作为第二个参数 0 传递时,函数可能会调用未定义的行为。

数组中的索引从 0 开始。因此您在函数中跳过了传递数组的第一个元素。

由于数组具有 unsigned int 类型的元素,因此表达式 -1 被隐式转换为 unsigned int 类型的最大值。因此,您需要决定是否确实要处理无符号整数数组或有符号整数数组。

printf 的调用中使用转换说明符 %d 而不是 %u 来输出类型为 unsigned int 的对象,如果对象的值确实如此,则可以调用未定义的行为不适合 int 类型的对象。

因此您的函数可以如下所示

typedef struct min_max_t
{
    size_t min;
    size_t max;
} min_max_t;

min_max_t min_max( const unsigned int *array, size_t size )
{
    min_max_t flag = { .min = 0, .max = 0 };

    printf( "Flag.min: %zu | ", flag.min );
    printf( "Flag.max: %zu\n", flag.max );

    for ( size_t i = 1; i < size; i++ )
    {
        printf( "i = %zu - [A:%u - Min:%u - Max:%u]\n", i, array[i], array[flag.min], array[flag.max] );

        if ( array[flag.max] < arra[i] )
        {
            flag.max = i;
        }
        else if ( array[i] < array[flag.min] )
        {
            flag.min = i;
        }

        printf( "i = %zu - [A:%u - Min:%u - Max:%u]\n\n", i, array[i], array[flag.min], array[flag.max] );
    }

    return flag;
}

寻找最小值和最大值的逻辑没有错。

您的代码的问题是您使用 %d 打印 unsigned int。打印 unsigned int 值时使用 %u.

您可能考虑处理的另一个问题是函数参数 size 的非法值。您的函数要求 size 至少为 2。为避免未定义的行为,您可能需要检查它。

例如,您可以在函数的开头添加

assert(size >= 2);

if (size < 2)
{
    // return some suitable value
}

也就是说,您也可以只记录要求 size 至少为 2 的函数。在 C 语言中,为函数设置此类契约要求并不少见。几个 stdlib 函数有这样的要求。

顺便说一句:如果您添加 size 检查,您可能还应该检查 array 是否为 NULL。

顺便说一句:您的屏幕截图表明您向函数传递了一个 int 数组。如果这是真的,那么你的调用者代码中就有一个错误。不要将 int 数组传递给需要 unsigned int 数组的函数。