• 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. }

    编程常见的错误

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

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

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

  • 相关阅读:
    显卡T600和RTX3050哪个好
    redis的性能管理
    H.265流媒体播放器EasyPlayer.js集成时页面报错出现“X”,该如何解决?
    PDF格式分析(七十)——注释边框样式及外观流
    Java 环境搭建
    2022河南萌新联赛第(七)场:南阳理工学院 H-防风台
    计算机图像处理-均值滤波
    ValueAnimator的一些骚玩法
    获取店铺所有商品API 返回值说明
    @Valid与@Validated区别和详细使用及参数注解校验大全
  • 原文地址:https://blog.csdn.net/qq_61658398/article/details/133170916