有人可以使我在C

时间:2015-05-04 06:23:37

标签: c arrays

我在techgig Code Gladiator中遇到过三个问题,它们的方法签名就像

一样
int getMax(int [] a);

其中" a"是一组正整数。
根据我所知道的所有理论,我可以说用C程序解决这个问题是不够的 通过观察,虽然我知道它们在理论上证明是错误的,但我提出了一种方法

for(i=0;a[i]>=0;i++);

在所有情况下都给出了正确的结果 有人可以建议是否可以在所有操作系统和编译器中使用它吗?

2 个答案:

答案 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。

我说即使在一个操作系统或编译器上也无法可靠地完成它。