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