序:指標與陣列是c語言中最常見的,其不同已於前面總結過,今天我寫一些我在寫c語言程式中遇到的錯誤,肯定不完整,但也可以作為錯誤總結防止再犯。
在寫之前,首先我要總結一點,那就是陣列遠比指標可靠,除了傳送實參和接收形參外,能用陣列的盡量不要用指標。
首先第一點,指標最容易出現的問題是野指標,即訪問了一段非法的位址空間。通常來說,指標必須指向一段你要求指向的空間,而當你只定義乙個指標卻並未初始化,或者指標使用完後只釋放記憶體卻未將指標置空,那麼野指標就會出現。
其次,野指標尋找起來是很困難的,因為大多數情況下他只會報段錯誤(記憶體洩漏),這就要求你一句一句找或用gdb偵錯程式,倘若**很長,必耗費精力。
最後,指標變數的指向是可以改變的,也就是說在子函式中,指向乙個陣列的指標變數所存放的可能不是頭乙個元素的位址,這就要求寫**時時刻注意指標變數到底此時指向**
舉個例子
#include
void string_deal(char *str)
int main()
看這個程式,很多人會認為str[0]永遠代表字串「abcdefg」中的乙個字元a,所以輸出都是a,當然,正確答案是a,b;的確陣列名是常量,不能自加自減,也就是說陣列名代表的永遠是首元素位址,但指標變數可以自加自減,用陣列代替指標,其本質還是指標,當str++後,str挪到了b位,此時的第0位應從b數起,所以第二個輸出b
大部分人認為這不難理解,但在實際的寫程式的過程中,常常出現這種現象:倘若子函式中要遍歷兩遍,前面遍歷字串用指標完成,後面遍歷又改用陣列,那麼很可能出現段錯誤或第二個遍歷什麼效果都沒有。
陣列易錯點
1.初始化定義 1.int n 常量表示式 常量表示式不能為變數 2.int main 內與int main 外的陣列初始化定義有區別 int main 內初始化為隨機,int main 外初始化值為0 2.資料範圍 a i 的i範圍不能超過常量表示式中的範圍 典型的陣列越界 3.陣列不能夠進行賦值...
指標難點 易錯點
voidf char c intmain f c 這裡的f char c 指向指標的指標 所以呼叫時一定要 使用指標 c 3 定義指標陣列 c 第乙個指標變數的位址。指標的位址 用指向指標的指標存放 二 例如 int a 3 4 ptr2是乙個指向 int 的指標,即ptr2的型別和 ptr是一樣的...
C 易錯知識點歸納
物件導向開發的四大特性 三字元組 內建型別所佔記憶體大小 單位 位元組 typedef 為乙個已知型別取新名字 列舉 派生資料型別,只有賦值運算子沒有定義算術運算 變數命名 字母 下劃線開頭,可以有數字,不能有標點符號。大小寫敏感。變數宣告 未開闢空間。extern實現,若在其後賦初始值便為定義。變...