• c语言-实用调试技巧


    什么是bug?

    程序中出现的问题

    调试是什么?有多重要?

    测试的基本步骤:发现程序错误的存在 以隔离、消除等方式对错误进行定位,确定错误产生的原因,提出纠正错误的解决办法,对程序错误予以改正,重新测试

    debug和release的介绍

    debug通常称为调试版本,他包含调试信息,并且不做任何优化,便于程序员调试程序

    release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。

    windows环境调试介绍

    一些调试的实例    

    如何写出好(易于调试)的代码

    使用断言:

    1. //模拟实现库函数 strcpy
    2. //拷贝字符串
    3. //函数返回的是目标空间的起始地址
    4. char* my_strcpy(char* dest,const char* src)
    5. {
    6. char* ret = dest;
    7. //断言
    8. assert(dest != NULL); //使用assert需要使用#include
    9. assert(src != NULL);
    10. //while (*src != '\0')
    11. // while (*dest = *src) // \0时 ascll为0,while判断为false
    12. // {
    13. // //*dest = *src;
    14. // dest++;
    15. // src++;
    16. // }
    17. while (*dest++ = *src++)
    18. {
    19. ; //空语句
    20. }
    21. return ret;
    22. }
    23. int main()
    24. {
    25. char arr1[] = "fanfan";
    26. char arr2[20] = {0};
    27. //char* p = NULL;
    28. //my_strcpy(p,arr1);
    29. //my_strcpy(arr2,arr1);
    30. //printf("%s\n",arr2);
    31. //printf("%s\n",strcpy(arr2,arr1));
    32. printf("%s\n",my_strcpy(arr2,arr1));
    33. return 0;
    34. }
    35. // int main()
    36. // {
    37. // // int num = 10;
    38. // // num = 20;
    39. // // int* p = #
    40. // // *p = 200;
    41. // const n = 100;
    42. // //n = 200; //err
    43. // int* p = &n;
    44. // *p = 20;
    45. // printf("%d\n",n);
    46. // return 0;
    47. // }
    48. // int main()
    49. // {
    50. // int m = 10;
    51. // //const不仅可以修饰变量也可以修饰指针
    52. // int n = 100;
    53. // const int* p = &m;
    54. // //*p = 0;
    55. // p = &n; //
    56. // printf("%d\n",m);
    57. // return 0;
    58. // }
    59. //const修饰指针的时候
    60. //当const放在*的左边的时候,限制的是指针指向的内容,不能通过指针改变指针指向的内容,但是指针变量的本身是可以改变的
    61. //当const放在*的右边的时候,限制的是指针变量本身,指针变量的本身是不能改变的,但是指针指向的内容是可以通过指针来改变的
    62. int main()
    63. {
    64. int m = 10;
    65. //const不仅可以修饰变量也可以修饰指针
    66. int n = 100;
    67. //const int* p = &m;
    68. //int* const p = &m;
    69. const int* p = &m;
    70. *p = 0;
    71. p = &n; //
    72. printf("%d\n",m);
    73. return 0;
    74. }
    75. //模拟实现一个strlen函数
    76. int my_strlen(const char* str)
    77. {
    78. assert(str); //断言判断是不是空指针
    79. int count = 0;
    80. while ( *str != '\0')
    81. {
    82. str++;
    83. count++;
    84. }
    85. return count;
    86. }
    87. int main()
    88. {
    89. char arr[] = "abcde";
    90. int len = my_strlen(arr);
    91. printf("%d\n",len);
    92. return 0;
    93. }

    编程常见的错误

    编译型错误:直接看错误提示信息(双击),解决问题,或者凭借经验就可以搞定,相对来说简单

    链接型错误:看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在,一般是标识符名不存在或者拼写错误

    运行时错误:借助调试,逐步定位问题,最难搞

  • 相关阅读:
    【零基础学Python】Day3 Python基本数据类型之Number
    2024年数字化经济与智慧金融国际会议(ICDESF 2024)
    基于C#的安全聊天工具设计
    mybatisplus开启sql打印的三种方式
    多线程 _ 基础篇 _ 线程安全问题【JavaEE初阶】
    阿里最新丰碑:国内第一本凤凰架构,全面构建可靠大型分布式系统
    Linux CentOS7 history命令
    【5】c++11新特性(稳定性和兼容性)—>override关键字
    opengles在车载360环视avm系统中的应用简介
    每周推荐短视频:为什么产品开发需要数字化?如何做到数字化?
  • 原文地址:https://blog.csdn.net/qq_61658398/article/details/133170916