这个c语言哪里错了?为什么呢?小白求详解

2025-02-27 09:57:26
推荐回答(5个)
回答1:

把usinged改成int就行了,因为如果len是unsigned类型的话,len-1是不会为负数的(因为类型限制),所以导致访问a越界

回答2:

unsigned ,len = 0 时, 储存为:0000000000.。。。00(32个0,没有第一位表示正负)
int i = 0 时, 储存为10000.。。00(1个1表示正负,31个0代表值)
而len-1 的储存为 1111111.。。11(32个1)
但是这个储存,如果表达成int型时,值为:+ 2的31次方-1 = 2 147 483 647,
这个循环,将执行2 147 483 647次,而声名的a数组,长度是0,有2个可能:
1,传的a的地址不是空,但是访问超越了声明的数组长度,就会报错 内存错误……
2,传的a的地址为空,访问空地址,为报错内存错误。

回答3:

你们学长说的是对的

回答4:

当len = 0时  a[]为空 所以进入循环时执行result+=a[i]时访问了a[0]而显然a[0]是不存在的所以出现访问异常

应该在循环内部判断  避免len = 0时访问 a[0]

if(len ==0)
  result = 0;
else 
  result += a[i];

回答5:

因为len的类型是unsigned类型,只能表示整数,即使0-1得到的只能是下溢的结果还是正数