实用调试技巧

目录

调试是什么?

调试的基本步骤

VS调试

如何写出好的代码

const修饰指针变量

调试是什么?

调试是对于程序来说是非常重要的,调试就是排错,检查程序中的错误。

调试的基本步骤

1.发现程序错误的存在

2.以隔离、消除等方式对错误进行定位

3.确定错误产生的原因

4.提出纠正错误的解决办法

5.对程序错误予以改正,重新测试

VS调试

在vs当中有Debug版本和Release,Debug是用来调试的,Release是用来发布的。

F5要和F9配合使用

F5启动调试直接到断点,F9创建断点。

F10是逐句调试,F11用来进入函数。

举例:

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("hehe\n");
	}
	return 0;
}
上述代码明显会发生函数越界,但是当你在VS2013调试的时候发现,代码会进入死循环。

主要原因:

i和arr中间正好是两个元素,i和arr是放在栈区的。

数组元素的地址下标,随下标的增长由低到高变化的。

栈的使用习惯:先使用高地址空间,再使用低地址的空间。

如何写出好的代码

优秀的代码:  
1. 代码运行正常
2. bug 很少
3. 效率高
4. 可读性高
5. 可维护性高
6. 注释清晰
7. 文档齐全
常见的 coding 技巧:
1. 使用 assert
2. 尽量使用 const
3. 养成良好的编码风格
4. 添加必要的注释
5. 避免编码的陷阱。

 

举例:

模拟实现strcpy 

版本1

void my_strcpy(char* dest, char* src)
{
	while (*src!='\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src; // \0
}

版本2

void my_strcpy(char* dest, char* src)
{
	while (*src != '\0')
	{
		*dest++ = *src++;
	}
	*dest = *src;
}

版本3

void my_strcpy(char* dest, char* src)
{
	//1.拷贝字符
	//2.遇到\0循环停止
	while (*dest++ = *src++) //考完\0 里面的结果为0,循环结束
	{
		;
	}
}

版本4

void my_strcpy(char* dest, char* src)
{
	/*if (src == NULL || dest == NULL)
	{
		return;
	}*/
	//assert(src != NULL);//断言-release版本可以优化掉
	//assert(dest != NULL);
	assert(src);
	assert(dest);
	while (*dest++ = *src++) 
	{
		;
	}
}

 上面用到assert,防止遇到NULL指针。

 版本5

void my_strcpy(char* dest,const char* src)
{
	assert(src != NULL);//断言-release版本可以优化掉
	assert(dest != NULL);
	while (*dest++ = *src++)
	{
		;
	}
}

 上面用到const修饰源字符串,防止源字符串和目的字符串放反。

const修饰指针变量

const 放在*左边

修饰的是指针指向的内容(*p),指针指向的内容,不能通过指针来改变,但是指针变量本身是可以改变的。

const 放在*右边

修饰的是指针变量本身(p),指针指向的内容可以修改,不能改变指针变量本身(p)。

int main()
{
	const int num = 10;
	//num = 20; //加上const 不能修改了

	//const 修饰指针
	//const int* p = &num; 
	//*p = 20; //不能修改 ,不加const能修改
	int n = 100;
	int* const p = &num;
	//p = &n; //不能修改要看const的位置
	printf("%d\n", num);
	return 0;
}


 

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值