C 为什么当长度=0时,此实践代码失败?

C 为什么当长度=0时,此实践代码失败?,c,C,嗨,我这本书有一个练习题,我无法回答。不,这不是家庭作业问题。这是我从一本推荐给我的书中自学出来的:计算机系统,程序员的观点 问题是: 感谢您的帮助 长度是无符号的,所以如果为该参数传递0,那么长度-1将是UINT_MAX,而不是您希望的-1;因此,循环将运行,并且您将在a的大小之外进行访问。将此无符号长度更改为int-length,您的代码将完美运行 而上述代码无法工作的原因是 使用无符号长度时,如果将0传递给长度,则循环中的长度为-1,该长度在该范围内循环,并取最大值,因此循环会出现分段错

嗨,我这本书有一个练习题,我无法回答。不,这不是家庭作业问题。这是我从一本推荐给我的书中自学出来的:计算机系统,程序员的观点

问题是:

感谢您的帮助

长度是无符号的,所以如果为该参数传递0,那么长度-1将是UINT_MAX,而不是您希望的-1;因此,循环将运行,并且您将在a的大小之外进行访问。

将此无符号长度更改为int-length,您的代码将完美运行

而上述代码无法工作的原因是


使用无符号长度时,如果将0传递给长度,则循环中的长度为-1,该长度在该范围内循环,并取最大值,因此循环会出现分段错误

使用gcc编译此值-Wextra将生成一个警告,用于有符号整数i和无符号长度之间的比较。您是否有任何理由难道就不能看看这本书为你提供的这个问题的解决方案吗?@JonathonReinhart警告?谁有多余的字节@RichardJ.RossIII-无符号整数的溢出是完全定义好的。Ohhhhkay,我现在明白了!它返回到所有1。谢谢抱歉,我是新来的这些低级东西:有符号整数的溢出是未定义的,但不是无符号类型。规范引用:6.2.5类型第9段:涉及无符号操作数的计算永远不会溢出,因为一个不能由结果无符号整数类型表示的结果被减少为比结果类型可以表示的最大值大一的数的模