目录
2.4例题:我想知道153是否为自幂数,你是否在傻乎乎的一直按着F10 ,那当i=100000要按多久?
实现代码:求 1!+2!+3! ...+ n! ;不考虑溢出。(下面代码有错误)
my_strcpy函数设计返回值类型char*是为了实现函数的链式访问
1.1 调试是什么?有多重要?
调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
2.1 Debug和Release
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使用。(不能调试)
2.2 下面程序在Debug和Release版本的区别
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = {0};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
在debug版本中,程序死循环;在release版本中,程序可以执行
原因在于:变量在内存中开辟的顺序发生了变化,影响到了程序执行的结果。
代码运行的结果:大概率是死循环
首先arr只有10个元素,但是i循环到12次,arr[10]的时候已经越界访问了.首先i和arr是局部变量,先创建i,再创建arr,又因为局部变量都是放在栈区上的,那栈区的使用习惯是先使用高地址,再使用低地址
i如果先初始化就放在上面,arr就是数组,但是数组的下标的增长地址是由低到高来增长的,数组如果越界了,也许有一次越界到了i所在的地址,把i的地址和arr数组的地址改为了0,for循环就重新开始计算了,为什么说结果大概率是死循环呢,因为你不知道arr数组和i的地址中间差了几个字节,但是如果arr数组越界访问到i的话就会死循环
把arr和i放反也是因为栈区的使用习惯,i如果后初始化的话,i就是低地址空间,这样arr越界访问就永远不会访问到i的地址,所以他会打印完后程序崩溃
中间空了多少是编译器自己的写法问题,比如你去其他平台也许空的都不一样,那为什么会死循环不会报错呢?因为程序一直在跑,for循环没有停下来,虽然arr越界访问了,但是程序必须得先执行完才能够报错,得完成一件事情才行
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%p\n", &i);
printf("%p\n", &arr[9]);
}
可以佐证,栈区空间使用习惯先使用高地址,再使用低地址
2.3 快捷键的使用方法
1.F5 开始调试
使用方法:直接按F5程序直接结束了,不能单独使用,需要配合F9(断点)使用
(多次按F5,会在原有逻辑断点处停下,例如循环从一次变为两次,停在下一次循环断点处),有人会发现按F5没有反应,这时候需要加上Fn+F5 or Fn+F10
2.Ctrl +F5 不调试,直接执行代码
3.F9 设置/取消 断点
使用方法:代码执行,按下F5,只有遇到断点F9处才停下
4.Ctrl + F 查找关键字
5.Ctrl +K+C 添加注释(配合全选使用) Ctrl + K+U取消注释
6.C语言中复制不需要选中复制,直接在需要复制的那一行按Ctrl+V,即可复制
此外,还有更多的快捷键,博客添加到下面
有同学发现,我打开调试->窗口,并没有发现监视是为什么?
这是因为,监视里的很多窗口是需要调试开始的时候才会显示出来,监视就是用来配合代码查错,要多练习