栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

一些调试技巧2

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一些调试技巧2

5.一些调试的实例

5.1 实例一 实现代码:求 1!+2!+3! ...+ n! ;不考虑溢出。

错误示范:

#include
int 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;
}

改正: 

#include
int 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 实例二(数组越界)

#include
int 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课件》

     

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002169.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号