为何C语言数组元素相乘时,换用'\0'等循环条件会输出错误值?
数组遍历条件错误导致计算结果异常的原因分析
当前这段代码能正常运行,把示例数组{1,2,3}的所有数字相乘得到结果6,但如果把while循环条件改成(arrn[i] != '\0')、(arr)或(arr != 0)时,会输出错误结果,下面逐个分析原因:
原代码
int perm(int arrn[]) { int i =0; int z; int t = 1; int result =1; while(arrn[i] < 9){ z = arrn[i]; t = t * z; //printf("%d", z); i++; } printf("%d", t); } int main() { int list1[] = {1,2,3}; perm(list1); }
各错误条件的问题解析
条件
arrn[i] != '\0':'\0'本质是ASCII值为0的字符,但你的整数数组{1,2,3}末尾并没有显式添加0作为结束标记。当i走到3时,arrn[3]属于数组越界访问,读取的是内存里的随机值。如果这个随机值不是0,循环会继续用随机数乘进去;就算随机值刚好是0,过程中也已经引入了无效数据,结果必然错误。注意:只有字符数组会自动在末尾补'\0',整数数组不会。条件
(arr)或(arr != 0):
函数参数里的int arrn[]会被编译器转成int* arrn(指针)。这两个条件判断的是指针本身是否为空,而不是数组元素是否遍历完。你调用函数时传入的list1是数组的首地址,肯定不是空指针,所以这个条件永远为真,循环会一直越界读内存里的随机数相乘,要么得到一个完全错误的数值,要么直接触发内存访问崩溃。
内容的提问来源于stack exchange,提问作者Nasir Anwer
相关产品推荐
相关产品推荐

