实用调试技巧

牧云@^-^@ 提交于 2021-01-28 09:17:57

Debug和Release

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };   
    for (i = 0; i <= 12; i++)
    {
        printf("hehe\n");
        arr[i] = 0;
    }
    //getchar();
    return 0;
}

内存有栈区,堆区,静态区,栈区存放局部变量。栈区的默认使用,先使用高地址处的空间,再使用低地址处的空间。数组的下标的增长,地址由低到高变化,正式由于栈区的使用是先用高地址再用低地址,所以数组超出范围之后的地址会往i所在的地址方向走,当超出范围的数组元素来到和i同一个地址,并且被赋值为0时,下一轮循环就开始了,并且进入了死循环。VC6.0下面<=10就会死循环。gcc编译器<=11 就会死循环。vs2013 <=12 死循环。这个时候在Release版本下进行调试会发现,会将代码优化,将内存结构进行优化,i的地址是小于arr的地址的。 这个是把对于i的定义放在arr之后显示的报错 libpng warning: iCCP: cHRM chunk does not match sRGB,本人使用的编译器是MSVS2019。

优秀代码的标准

1.代码运行正常
2.bug少
3.效率高
4.可读性好
5.可维护性高
6.注释清晰
7.文档齐全
常见的coding技巧
1.使用assert
2.尽量使用const
3.养成良好的编码风格
4.添加必要的注释
5.避免编码的陷阱











模拟实现strcpy

#include <stdio.h>
#include <assert.h>
//void my_strcpy(char* des, char* src)
//{
//  while (*src!='\0')
//  {
//      *des = *src;
//      *des++;
//      *src++;
//  }
//  *des = *src;
//} --6分
//void my_strcpy(char* des, char* src)
//{
//  while (*src != '\0')
//  {
//      *des++ = *src++;
//  }
//  *des = *src;
//}
//void my_strcpy(char* des, char* src)
//{
//  while (*des++ = *src++)
//  {
//      ;
//  }
//} //妙哇 7分 但是没有考虑到输入有误的情况,比如输入一个空指针

void my_strcpy(char* dest, char* src)
{
    assert(dest != NULL);
    assert(src != NULL);
    while (*dest++ = *src++)
    {
            ;
    }

} //8分

int main()
{
    char arr1[] = "***************";
    char arr2[] = "hasaki";
    my_strcpy(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

很烦的一点,当时调试的时候NULL一直显示未定义,查了之后说是需要stdio.h,我也引用了啊,,然后我就想到了C语言之中一直存在的语序问题,最后发现,这个头文件需要引用在NUL的使用之前,这个函数的优化还未完成,之后还会有更加好的版本

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!