面试二

关于利用实参传递数组讨论.

简单说下背景:

最开始要求将一个数组的最小值取出来.例如int a[10] = { 0,11,2,23,4,95,64,71,8,29}

现在想要取最小值0.

题目本身很简单,做法如下.

int GetMin( int* a,int n )

{

int iIndex = 0;

for ( int i = 1;i <= 9;++ i )

{

if ( a[i] <= a[iIndex] )

{

iIndex = i;

}

}

return iIndex;

}

int main()

{

int a[10] = { 10,11,2,23,4,95,64,71,8,29};

cout<<"数组最小值为:"<<a[GetMin( a,10 )]<<endl;

system("pause");

return 0;

}

Main函数里面使用a[GetMin( a,10 )]其实本身是没有太多讨论的地方(起码我不想讨论),你可以单独写个语句存放索引,然后输出.

好,程序很快搞定,但是面试的人又突然问一个问题:

像这样的做法,如果a数组本来只有10个.但是别人在使用的时候出现了错误.传入了100.

那么程序将怎样修改呢?

说实话,之前确实没有想过这类问题,还记得传递数组的时候还是在学习老谭那本C的时候才有的经历.当然了,对于GetMin中的形参是指针,理论上应该可以判断是否为空的.

当时我并没给出判空条件.他给的意见是,为a判断是否为空操作.这样可以防止a索引非法.我给出又一个问题是:如果程序在使用的时候a这个指针内存后面(就是10个int后面)还有其他变量怎么办?如果简单的这样做,岂不出现错误?

后来回来我也一直在想这个问题,是啊,如果真如我所给出的问题那样,岂不悲剧了.

其实,这是一个编程常见的问题:接口调用参数非法问题. 别人需要的是数组索引,而你却传了一个错误索引.

其实,如果需要细说,得从两个方面来讲:

1. 指针判空处理当然是不正确的,因为程序可能处理的是一些不是很重要的数据,但是当数据显示在界面上的时候,如果出错就会造成问题.产品开发出来的时候,可能会经过几轮测试,测试人员最开始可能注重的是重要功能的测试,不重要的测试只是带过一下.而且,也可能出现的一种情况是,测试机上面a[]数组后面没有数据.测试机上没有问题.这样,等待产品上线了....回来定位的时候无法重现.这样定位其实有时候是很难的.

2. 我们就不应该在开发的时候就决解这个问题吗?如果把接口加上"容错机制",表面上程序没有问题,可是加重定位问题的难度.接口调用者非法调用函数,直接报错(对本题而言,报错的概率会很大).我认为这种方式最好.

最后还是要发下牢骚,公司的试题太坑爹了.居然会问1MB等于多少KB.做软件不知道这个,做啥软件啊?

你可能感兴趣的:(编程,c,面试,测试,产品)