1.【OJ】設計一個函數sum(n)=1+2+...+n,假設sum(n)不超過整型數表示範圍。函數
錯誤解法:設計
int sum(n){ int ans; ans = n*(n+1)/2; return ans; }錯誤在於:n*(n+1)時可能已經超出了整型數的表示範圍,形成溢出錯誤。
int sum(n){ if(n%2) return (n+1)/2*n; else return n/2*(n+1); }
2.【美圖】請寫出下面程序的運行結果。指針
void func(void){ char *dst; dst = (char*)malloc(sizeof(char)*1024); strcpy(dst, "Hello"); free(dst); if(dst!=NULL){ strcpy(dst, "World"); } printf("%s", dst); }易錯之處:
①free後只是將堆空間交還給系統,並不對指針變量dst和dst所指向的內存空間內容進行修改;code
②free後的dst指針是野指針,若是系統在free後佔用dst所指空間,那麼對dst的操做將產生錯誤,若是系統並沒佔用dst所指空間,操做是成功的,可是隱患很大。blog
因此上面代碼運行結果可能爲:程序出錯,非法訪問內存;輸出World字樣。ip
3.【美圖】請指出下面程序的錯誤。內存
char* func(char *s, int len){ char dst[1024]; memcpy(dst, s, len); return dst; }易錯之處:
①memcpy與strcpy不一樣,memcpy嚴格按照指定參數len來複制字節數,因此這裏可能會遺漏'\0'字符串結束符,致使錯誤;字符串
②dst爲局部變量,當函數返回時,dst所指向的1024個字節空間將被釋放(退棧),所返回的dst指針指向的內容會被其餘內容所覆蓋,因此返回的dst是無用的。
class