C语言 程序未按预期找到数组中的最大数字

yk9xbfzb  于 2023-02-21  发布在  其他
关注(0)|答案(4)|浏览(129)

这个程序应该返回数组“array”中最大的数字。但是它只返回第一个和第二个数字之间的最大数字。为什么?

#include <stdio.h>
#include <stdlib.h>
int HighestNumber(int* array)
{
    int highest = INT_MIN;
    for(size_t x = 0; x < sizeof(array) / sizeof(array[0]); x++)
        if(array[x] > highest)
            highest = array[x];
    return highest;
}
int main()
{
    int *array = (int*)malloc(4*sizeof(int));
    array[0] = 66;
    array[1] = 552;
    array[2] = -17;
    array[3] = 1000;
    printf("%d", HighestNumber(array));
    return 0;
}
oogrdqng

oogrdqng1#

函数参数array的指针类型为int *

int HighestNumber(int* array);

因此,表达式sizeof(array) / sizeof(array[0])等价于表达式sizeof( int * ) / sizeof( int ),并且通常根据指针和整数的大小产生值2或1。
您需要显式传递数组中的元素数As,例如

int HighestNumber(int* array, size_t n );

请注意,用户可以为参数n传递0。在这种情况下,使用您的函数定义方法,函数可能会返回无效值。
这个函数应该用下面的方法声明和定义。因为这个函数不改变处理过的数组,所以第一个参数应该有限定符const

size_t HighestNumber( const int *array, size_t n )
{
    size_t highest = 0;

    for ( size_t i = 1; i < n; i++ )
    {
        if ( array[highest] < array[i] )
        {
            highest = i;
        }
    }

    return highest;
}

函数的调用方式如下

printf("%d\n",  array[HighestNumber(array, 4 )] );

size_t highest = HighestNumber(array, 4 );

printf( "The largest number is %d at the position %zu\n",
        array[highest], highest);

正如您所看到的,这种函数定义的优点是您还可以确定数组中最高元素的存储位置。
请注意,您需要释放动态分配的内存。

free( array );
yhived7q

yhived7q2#

sizeof技巧对指针不起作用!
如果应用于指针,则会得到指针大小与数组中单个元素大小的比率(截断),无论数组有多大,指针大小始终相同,因此在int*的情况下,最有可能是2(64位系统,通常为8字节指针,4字节int)或1(32位系统,通常为4字节指针、4字节int),尽管其它系统可产生其它值,但仍然不是所需的(除了 * 偶然 * 匹配数组大小...)。
要在数组上使用size,需要通过另一个参数显式传递它:

int highestNumber(size_t length, int* array)
{
    int highest = INT_MIN;
    while(length--)
    {
        if(*array > highest)
        {
           highest = *array;
        }
        ++array;
    }
    return highest;
}

然后,您可以对要传递到的数组应用sizeof技巧:

int array[4];
// assign values to

// array has not yet decayed to pointer, thus you can do:
int highest = highestNumber(sizeof(array)/sizeof(*array), array);

然而在你的例子中你使用了一个 * 动态 * 分配的数组--这些 * 只能 * 存储在指针中,因此没有办法显式地跟踪大小:

size_t length = 4;
int* array = malloc(length * sizeof(*array));
// assign values
int highest = highestNumber(length, array);

最后一点:当然,您也可以使用length/size作为第二个参数;将其作为第一将允许:

int highestNumber(size_t length, int array[length]);

这是完全等效的,因为对于最外面的维度,显式指定的数组大小被忽略,并且参数仍然保持为指针(注意,这 * 不 * 适用于进一步的维度),但是这个声明更显式地表达了函数实际期望作为参数的内容。

因为你不打算修改函数中的数组,所以接受一个指向const的指针是一个不错的选择--这允许同时使用非常数数组和常量数组,而原始函数签名不需要排除后者:

int highestNumber(size_t length, int const* array)
int highestNumber(size_t length, int const array[length]);
unftdfkk

unftdfkk3#

当你把array传递给函数HighestNumber()时,你丢失了数组的大小信息,这被称为数组到指针衰减。
对于函数HighestNumber(),它只看到一个指针,而不知道任何关于数组的信息。
考虑将数组大小作为第二个参数传递给函数,例如

int HighestNumber(int* array, size_t num) {
    // ..
}
8aqjt8rx

8aqjt8rx4#

数组衰减为函数参数中的指针。指针上的sizeof将返回指针的大小,而不是所指向的数据。

可能的解决方案:

将数组的大小作为第二个参数传递。

int HighestNumber(int* array, size_t size) {
    //...
}

相关问题