实用调试技巧

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。c++

优秀代码的标准

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的使用以前,这个函数的优化还未完成,以后还会有更加好的版本ide