返回多个东西的函数

时间:2015-05-06 19:05:55

标签: c

我正在学习C,我正在尝试创建一个能够返回更多内容的函数。我已经编写了代码,但其中一个值没有给我正确的输出,我无法弄清楚为什么会这样做。

struct num {
    int min;
    int max;
};

struct num Some(int Array[]) {
    int i;
    struct num result;
    result.max = Array[0];
    result.min = Array[0];
    for(i = 0; i<=3; i++) {
        if(result.min > Array[i]) {
            result.min = Array[i];
        } else if(result.max < Array[i]) {
            result.max = Array[i];
        }
    }
    return result;
}

int main()
{
    int Array[] = {7,8,3};
    struct num something;
    something  = Some(Array);
    printf("Total is %d and max is %d",something.min,something.max);
}

程序打印数组的正确最小值,但它给出的最大值为4200784。

3 个答案:

答案 0 :(得分:8)

for(i = 0;i<=3;i++){
//        ^^^^

你循环四次。

在包含三个元素的数组上。

答案 1 :(得分:1)

您使用的索引范围不正确。由于原始数组只有3个元素,因此索引的有效范围为[0, 2]。因此在函数循环中

for(i = 0; i<=3; i++) {

当我等于3时,你试图访问数组之外​​的内存。

但无论如何功能设计并不好。它使用幻数3.因此它只能应用于三个元素的数组。此外,您无法确定哪个元素是最小元素,哪个元素是最大元素。

更好的方法是以下

typedef struct minmax 
{
    size_t min;
    size_t max;
} minmax_t;

minmax_t minmax_element( const int a[], size_t n ) 
{
    minmax_t result = { 0, 0 };

    for ( size_t i = 0; i < n; i++ ) 
    {
        if ( a[i] < a[result.min] )
        {
            result.min = i;
        }
        else if ( a[result.max] < a[i] ) 
        {
            result.max = i;
        }
    }

    return result;
}

在主要功能中可以通过以下方式调用

int main()
{
    int a[] = { 7, 8, 3 };
    minmax_t something;

    something  = minmax_element( a, sizeof( a ) / sizeof( *a ) );

    printf( "Minimum is %d and max is %d\n", a[something.min], a[something.max] );

    int b[] = { 7, 8, 3, 0, 1, 5, 9 };

    something  = minmax_element( b, sizeof( b ) / sizeof( *b ) );

    printf( "Minimum is %d and max is %d\n", b[something.min], b[something.max] );
}

考虑到在C ++中有标题std::minmax_element中声明的相应算法<algorithm>它返回第一个最小元素和最后一个最大元素的一对指针(迭代器)。你可以改变我所展示的函数,它也会返回数组中最后一个最大元素的索引,而不是第一个最大元素。

答案 2 :(得分:0)

sizeof

要获得正确的分辨率,您应该使用上述内容来获取要使用的数组的确切大小,而不是i <= 3。