我在techgig Code Gladiator中遇到过三个问题,它们的方法签名就像
一样int getMax(int [] a);
其中" a"是一组正整数。
根据我所知道的所有理论,我可以说用C程序解决这个问题是不够的
通过观察,虽然我知道它们在理论上证明是错误的,但我提出了一种方法
for(i=0;a[i]>=0;i++);
在所有情况下都给出了正确的结果 有人可以建议是否可以在所有操作系统和编译器中使用它吗?
答案 0 :(得分:1)
该函数具有未定义的行为。没有什么能阻止编译器生成的目标代码扫描数组之外的内存。
我尝试了以下简单程序
#include <stdio.h>
int getMax( int a[] )
{
int i = 0;
for ( ; a[i] >= 0; i++ );
return i;
}
int main( void )
{
int x = 0;
int a[] = { 1, 2, 3 };
int y = 4;
printf( "&x = %p, a = %p, &y = %p\n", &x, a, &y );
printf( "%i\n", getMax( a ) );
}
我得到了以下结果
&x = 0302FF00, a = 0302FF04, &y = 0302FEFC
55
正如您所看到的那样55
与数组的大小不相符:)。
在我得到结果的另一台计算机上运行此代码
&x = 0xbf8704ac, a = 0xbf8704a0, &y = 0xbf87049c
4
答案 1 :(得分:0)
当您读取负值时,它不是数组的一部分,因此可能超出界限&#34;。
另外,你不知道有多少&#34;不在阵列中#34;在你达到负值之前有正值。
考虑一个长度为5 { 10, 20, 30, 40, 50 }
的数组,然后是未初始化的数据{7378, 3562, 6271, 73473, -1 }
。你的最大值是&#34;坏&#34;值73473不是预期的50。
我说即使在一个操作系统或编译器上也无法可靠地完成它。