首页 > 试题广场 >

考虑下列代码,这段代码试图计算数组a中所有元素的和,其中元素

[问答题]
考虑下列代码,这段代码试图计算数组a中所有元素的和,其中元素的 数量由参数length给出。
/* WARNING: This is buggy code */
float snm_elements(float a[], unsigned length) {
       int i;
       float result =0;
       for (i= 0; i <= length-1; i++)
       result += a[i];
       return result;
}
当参数length等于0时,运行这段代码应该返回0. 0。但实际上,运行时会遇 到一个内存错误。请解释为什么会发生这样的情况,并且说明如何修改代码。
解释:length是无符号int型,在第五行中 for (i= 0; i <= length-1; i++),假设length为0的话,length-1在unsigned型是无法表示的。C语言默认在算术运算中,如果运算参数含有unsigned,会隐式将有符号参数变为unsigned。在此处,length-1 = 0-1 = -1。-1转换为unsigned的话,为2^32 - 1,其范围远远超出a[],造成越界,所以会报错。
解决方法:将第二行中的unsigned改为int型即可解决。
作为初学者的简单想法,如不正确,还望指正!

编辑于 2021-05-09 22:20:04 回复(0)