一个有趣的问题

本文解释了在C语言中,当传递一个unsigned类型的len=0给一个int类型的数组长度时,for循环的边界计算导致的意外行为。由于int的-1转换为unsigned后的巨大值导致数组越界,实际运行中会引发段错误。
摘要由CSDN通过智能技术生成

这是一个讨论题,学了类型转换之后很好理解,但是之前我想法错了,在此分享一下。

#include<stdio.h>

void sum(int a[],unsigned len)
{
    int i,sum=0;
    for(i=0;i<=len-1;i++)
    {
        sum+=a[i];
    }
    printf("%d",sum);
}

int main()
{
    int a[3]={1,2,3};
    sum(a,0);

运行后会有什么结果?

解答:

没有结果。

注意len是unsigned类型,传参0的时候,for循环里len-1会将int的-1转换为unsigned。

(表达式存在有符号数和无符号数时,int默认转换为unsigned)

转换过程:

-1的补码为1111 1111 1111 1111 1111 1111 1111 1111

在unsigned中这个数代表2^32-1。

其中a数组只有3个元素,for循环中会非法访问,引起段错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值