这个程序应该返回数组“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;
}
4条答案
按热度按时间oogrdqng1#
函数参数
array
的指针类型为int *
。因此,表达式
sizeof(array) / sizeof(array[0])
等价于表达式sizeof( int * ) / sizeof( int )
,并且通常根据指针和整数的大小产生值2或1。您需要显式传递数组中的元素数As,例如
请注意,用户可以为参数n传递0。在这种情况下,使用您的函数定义方法,函数可能会返回无效值。
这个函数应该用下面的方法声明和定义。因为这个函数不改变处理过的数组,所以第一个参数应该有限定符
const
。函数的调用方式如下
或
正如您所看到的,这种函数定义的优点是您还可以确定数组中最高元素的存储位置。
请注意,您需要释放动态分配的内存。
yhived7q2#
sizeof技巧对指针不起作用!
如果应用于指针,则会得到指针大小与数组中单个元素大小的比率(截断),无论数组有多大,指针大小始终相同,因此在
int*
的情况下,最有可能是2(64位系统,通常为8字节指针,4字节int
)或1(32位系统,通常为4字节指针、4字节int
),尽管其它系统可产生其它值,但仍然不是所需的(除了 * 偶然 * 匹配数组大小...)。要在数组上使用size,需要通过另一个参数显式传递它:
然后,您可以对要传递到的数组应用
sizeof
技巧:然而在你的例子中你使用了一个 * 动态 * 分配的数组--这些 * 只能 * 存储在指针中,因此没有办法显式地跟踪大小:
最后一点:当然,您也可以使用length/size作为第二个参数;将其作为第一将允许:
这是完全等效的,因为对于最外面的维度,显式指定的数组大小被忽略,并且参数仍然保持为指针(注意,这 * 不 * 适用于进一步的维度),但是这个声明更显式地表达了函数实际期望作为参数的内容。
因为你不打算修改函数中的数组,所以接受一个指向
const
的指针是一个不错的选择--这允许同时使用非常数数组和常量数组,而原始函数签名不需要排除后者:unftdfkk3#
当你把
array
传递给函数HighestNumber()
时,你丢失了数组的大小信息,这被称为数组到指针衰减。对于函数
HighestNumber()
,它只看到一个指针,而不知道任何关于数组的信息。考虑将数组大小作为第二个参数传递给函数,例如
8aqjt8rx4#
数组衰减为函数参数中的指针。指针上的
sizeof
将返回指针的大小,而不是所指向的数据。可能的解决方案:
将数组的大小作为第二个参数传递。