调试快捷键(调试时才能看到)
F9——设置断点(代码执行后,停在断点处),和F5(跳到下一个断点处)连用。
F10——逐过程,不进入函数内部
F11——逐语句,进入函数内部(像printf这样的库函数不一定能看),shift+F11跳出函数内部。
CTRL+F5——开始执行不调试
shift+F9——快速监视
shift+F5——停止调试
窗口
自动窗口——不用手动添加变量名,但是有些变量名会自动消失,不能自行添加变量名。
局部变量——不用手动添加变量名,只能观察局部代码块中的内容,不能自行添加变量名。
监视——最常用
内存——常用
反汇编、寄存器
调用堆栈(像压子弹一样看函数调用的关系)
在红色小圆点处右击,可以设置条件断点,提高速度。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<=12; i++)
{
printf("hehe\n");
arr[i] = 0;
}
return 0;
}
神奇代码死循环的原因
内存分为几个区:栈区/堆区/静态区
而栈区内存放的是局部变量
1.栈区的默认使用:先用高地址处的空间,再使用低地址处的空间。
2.数组随着下标的增长,地址是由低到高的。
而数组越界了,就会一直向上放值,直到i的值改变成0;
至于为什么要空两格,也就是8个字节,这是给你容错用的。不同编译器也不同,也就是说内存布局不同。
Debug版本
Release版本
assert(断言) ,用头文件#include <assert.h>
可以判断()中的语句是否有问题。有问题会查出错误。
断言按中文的意思就是十分肯定的说,
那assert(dest != NULL),说是十分肯定dest不是NULL,是NULL会报错。
1)const 放在左边时,修饰的是*p,指针指向的值不能改变,也就是说进行解引用时会err。
2)const放在右边时,修饰的是p,num的地址,可以进行这个地址的解引用操作,但是不能修改它的地址。
加上const使代码更具有安全性。