debug和release
debug是调试版本,release是发布版本。
debug包含调试信息,不会做任何优化,便于程序员调试程序。
release通常是进行了各种优化,可能对内存布局都会发生改变。使得程序在代码大小和运行速度上都是最优解。
快捷键的使用
F5是开始调试,只显示结果,不会单独使用,一般配合F9使用。
F9的功能是切换/设置/取消断点。表现为一个红点。如图:
断点可以设置条件:
F11可以进入函数内部,F10则不会。
调试的的时候看程序信息
先调试起来。
内存的储存
#include <stdio.h>
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]);
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
使用assert和const
//assert包含在<assert.h>的头文件中。
//my_strcpy函数设计返回值类型是为了实现函数的链式访问
//链式访问指返回目标起始地址,返回值作为其他函数参数。
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);//断言
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "hello bit";
char arr2[20] = "xxxxxxxxxxx";
char* p = NULL;
printf("%s\n", my_strcpy(arr2, arr1));
return 0;
}
assert中条件为假就会报错。告诉我们代码哪一行出现问题,从而定位和解决问题。
但在release版本下会被优化掉。
int main()
{
const int num = 10;
int n = 100;
const int * const p = #
//*p = 200;
//int * const p = #
//const放int前后无所谓,主要是星号前后,上面这种写法就使得*p可以被改变。
//const 可以修饰指针
//const 放在*的左边(const int* p;)
//const修饰的是*p,表示p指向的对象不能通过p来改变,但是p变量中的地址是可以改变的
//const 放在*的右边(int* const p;)
//const 修饰的是p,表示p的内容不能被改变,但是p指向的的对象是可以通过p来改变的
printf("%d\n", num);//20
return 0;
}