實用調試技巧

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的使用之前,這個函數的優化還未完成,之後還會有更加好的版本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章