#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.避免編碼的陷阱數組
#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