You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:33:33