程序中出现的问题
测试的基本步骤:发现程序错误的存在 以隔离、消除等方式对错误进行定位,确定错误产生的原因,提出纠正错误的解决办法,对程序错误予以改正,重新测试
debug通常称为调试版本,他包含调试信息,并且不做任何优化,便于程序员调试程序
release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。
使用断言:
- //模拟实现库函数 strcpy
- //拷贝字符串
-
- //函数返回的是目标空间的起始地址
- char* my_strcpy(char* dest,const char* src)
- {
- char* ret = dest;
- //断言
- assert(dest != NULL); //使用assert需要使用#include
- assert(src != NULL);
- //while (*src != '\0')
- // while (*dest = *src) // \0时 ascll为0,while判断为false
- // {
- // //*dest = *src;
- // dest++;
- // src++;
- // }
- while (*dest++ = *src++)
- {
- ; //空语句
- }
-
- return ret;
-
- }
- int main()
- {
- char arr1[] = "fanfan";
- char arr2[20] = {0};
- //char* p = NULL;
- //my_strcpy(p,arr1);
- //my_strcpy(arr2,arr1);
-
-
- //printf("%s\n",arr2);
- //printf("%s\n",strcpy(arr2,arr1));
- printf("%s\n",my_strcpy(arr2,arr1));
-
- return 0;
- }
-
- // int main()
- // {
- // // int num = 10;
- // // num = 20;
- // // int* p = #
- // // *p = 200;
-
- // const n = 100;
- // //n = 200; //err
- // int* p = &n;
- // *p = 20;
- // printf("%d\n",n);
-
-
- // return 0;
- // }
-
- // int main()
- // {
- // int m = 10;
- // //const不仅可以修饰变量也可以修饰指针
- // int n = 100;
- // const int* p = &m;
- // //*p = 0;
- // p = &n; //
- // printf("%d\n",m);
-
- // return 0;
- // }
-
- //const修饰指针的时候
- //当const放在*的左边的时候,限制的是指针指向的内容,不能通过指针改变指针指向的内容,但是指针变量的本身是可以改变的
- //当const放在*的右边的时候,限制的是指针变量本身,指针变量的本身是不能改变的,但是指针指向的内容是可以通过指针来改变的
- int main()
- {
- int m = 10;
- //const不仅可以修饰变量也可以修饰指针
- int n = 100;
- //const int* p = &m;
- //int* const p = &m;
- const int* p = &m;
- *p = 0;
- p = &n; //
- printf("%d\n",m);
-
- return 0;
- }
-
- //模拟实现一个strlen函数
-
- int my_strlen(const char* str)
- {
- assert(str); //断言判断是不是空指针
- int count = 0;
- while ( *str != '\0')
- {
- str++;
- count++;
- }
-
- return count;
-
- }
-
- int main()
- {
- char arr[] = "abcde";
- int len = my_strlen(arr);
- printf("%d\n",len);
-
-
- return 0;
- }
编译型错误:直接看错误提示信息(双击),解决问题,或者凭借经验就可以搞定,相对来说简单
链接型错误:看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在,一般是标识符名不存在或者拼写错误
运行时错误:借助调试,逐步定位问题,最难搞