首页 > 代码库 > 深入理解计算机系统第二版习题解答CSAPP 2.11
深入理解计算机系统第二版习题解答CSAPP 2.11
在2.10中的inplace_swap函数的基础上,你决定写一段代码,实现将一个数组中的元素两端依次对调,你写出下面这个函数:
1 void reverse_array(int a[], int cnt) 2 { 3 int first, last; 4 for(first = 0, last = cnt - 1; 5 first <= last; 6 first ++, last --) 7 { 8 inplace_swap(&a[first], &a[last]); 9 }10 }
当对一个数组包含1、2、3、4时,得到预期的结果4、3、2、1。不过,当一个包含元素为1、2、3、4、5的数组使用这个函数时,你会很惊奇看到结果为5、4、0、2、1。对于偶数个元素的数组正常工作,奇数个元素的数组会把中间元素设置为0。
A.对于一个长度为奇数的数组,长度为cnt = 2k + 1,函数reverse_array最后一次循环中,变量first和last的值分别是什么?
B.为什么这时调用函数inplace_swap会将数组元素设置为0?
C.对reverse_array的代码做哪些简单改动就能消除这个问题?
解答:
A. first和last都为k。
B. 最后一次循环时。假设a[k]为p。
步骤 | *x | *y |
初始 | a[k]=p | a[k]=p |
第一步 | 0 | p^p=0 |
第二步 | 0 | 0 |
第三步 | 0 | 0 |
C. 将第5行代码改为如下即可。
1 first < last
深入理解计算机系统第二版习题解答CSAPP 2.11
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。