vs调试技巧(day16)
原创
©著作权归作者所有:来自51CTO博客作者蓝色fufu的原创作品,请联系作者获取转载授权,否则将追究法律责任
储存代码版本
版本名称 | 作用 |
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;
}
入栈
出栈
出栈完成,退出调试状态。
栈区内存的默认使用规则
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;
}
结果
报错是因为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内存
arr1内存
copy后
arr1内存
如果将strcpy函数填反以后,会出现如下情况:
arr2内存
出现了越界访问。
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的关系绑定