5.一些调试的实例
5.1 实例一 实现代码:求 1!+2!+3! ...+ n! ;不考虑溢出。
错误示范:
#includeint main() { int n = 0; scanf("%d", &n); int i = 0; int j = 0; int ret = 1; int sum = 0; for (j = 1; j <= n; j++) { for (i = 1; i <= j; i++)//当j=2时,ret为2的阶乘2,下次计算是ret变为2,不再是1 { ret *= i;//ret为上一次循环后的ret与j的阶乘的乘积 } sum += ret; } printf("%d", sum); return 0; }
改正:
#includeint main() { int n = 0; scanf("%d", &n); int i = 0; int j = 0; int ret = 1; int sum = 0; for (j = 1; j <= n; j++) { ret=1;//初始化ret,使得ret经过一次阶乘计算后的值回到1 for (i = 1; i <= j; i++) { ret *= i; } sum += ret; } printf("%d", sum); return 0; }
5.2 实例二(数组越界)
#includeint main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10}; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehen"); } return 0; }
该程序运行的结果:死循环打印hehe。
解析如下:(1)“i”和“arr”均为局部变量,在内存中,局部变量在栈区中存储。
(2)局部变量在栈区的存储规则是先使用高地址空间,再使用低地址空间。
(3)数组中的元素随着下标增长地址由低到高连续变化。
在vs中,变量“i”与数组变量“arr”中间相隔2字节,当数组越界访问arr[12]时,此时arr[12]与变量“i”的地址相同,arr[12]与变量“i”均被初始化为0;程序死循环。
番外:推荐阅读书籍:
《明解C语言》(初阶与进阶)
《C和指针》
《C缺陷和陷阱》
《c primer plus》(较厚,需较长时间肝)
《比特C课件》



