储存代码版本

版本名称

作用

debug

带调试

release

优化运行及大小

快捷键

快捷键

作用

F5

自动执行到断点

F9/左键

设置断点

F10

逐过程

F11

逐语句

shift+F11

跳出函数

shift+F5

停止调试

调用堆栈

void test_2(int x)
{
printf("%d\n", x);
}
void test_1(int x)
{
test_2(x);
}
void test(int x)
{
test_1(x);
}

int main()
{
int a = 0;
test(a);
return 0;
}

入栈

vs调试技巧(day16)_i++

vs调试技巧(day16)_快捷键_02

vs调试技巧(day16)_f5_03

vs调试技巧(day16)_i++_04

出栈

vs调试技巧(day16)_i++_04

vs调试技巧(day16)_f5_06

vs调试技巧(day16)_f5_07

vs调试技巧(day16)_f5_08

出栈完成,退出调试状态。

栈区内存的默认使用规则

1)一般由高地址空间向低地址空间

2)数组随下标变化,内部元素由低地址向高地址。

这也是数组越界访问经常出现的问题,即数组越界访问后,越界数组元素更改了前方变量的值。

实例

int main()
{
int i = 0;
int arr[5] = { 1,2,3,4,5 };
for (i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
for (i = 0; i < 10; i++)
{
printf("hehe\n");
arr[i] = 0;
}
return 0;
}

结果

vs调试技巧(day16)_快捷键_09

报错是因为arr[]越界访问后,将0值赋给了i所占内存区域,非法占用了i的内存空间。

int main()
{
char arr1[] = "################";
char arr2[] = "hellow";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}

我们把arr2里的字符信息copy到arr1内。

copy前

arr2内存

vs调试技巧(day16)_i++_10

arr1内存

vs调试技巧(day16)_f5_11

copy后

arr1内存

vs调试技巧(day16)_f5_12


如果将strcpy函数填反以后,会出现如下情况:

arr2内存

vs调试技巧(day16)_快捷键_13

vs调试技巧(day16)_快捷键_14

出现了越界访问。

const修饰

int a = 10;
int* pa = &a;//为变量a的地址创建指针变量
int a = 10;
const int* pa = &a;//const修饰的是指针pa指向地址里的值
int a = 10;
int* const pa = &a;//const修饰的是指针pa,即指针pa与a的关系绑定