目录
调试是什么?
调试是对于程序来说是非常重要的,调试就是排错,检查程序中的错误。
调试的基本步骤
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 = #
//*p = 20; //不能修改 ,不加const能修改
int n = 100;
int* const p = #
//p = &n; //不能修改要看const的位置
printf("%d\n", num);
return 0;
}