天天看點

C程式設計經驗總結

Part 1 《c traps and pitfalls》:

[1]memcpy(pKeyTcam+i*9,  &sTcamTmpKey+27-i*9,  TCAM_LINE_SIZE);外面是個for循環控制,錯誤:pKeyTcam+i*9每次不是加了9個位元組,而是加了9*sizeof(sTcamTmpKey)個位元組。

char *str = ”weimeng”;

char s[] = “weimeng”;

sizeof(str) 4 原因:是關鍵字,不牽涉傳入類型,而是對關鍵字内容進行識别。也就是說,除數組名被用為sizeof的參數這一情形,其它所有情形數組名都代表下标為0的元素的位址。

sizefo(s)  8  同理;

而strlen是庫函數,strlen(str), strlen(s)都是7,因為都轉換為指針了。

[2]詞法分析:貪心法 a+++++b到底是啥?對于讀入的符号,如果可能和後面的符号組成新的符号,那麼繼續讀,止到不能再組成一個新的有意義的符号。

例如a---b 與a-- -b相同。不過平時不推薦這麼用。

a++ + ++b還是((a++) ++)+b? 應該為前者。因為a++的結果不能作為左值。

[3]046與46的值不一樣,前者為八進制,要防止誤寫。

[4]運算符優先級問題:r = hi<<4 + low;相當于r = hi << (4+low),與預期的相反,那麼這裡應該是:r =hi << 4 | low。

[5]注意語句末尾的分号。例如:就會引起錯誤。

Typedef struct

{

         Inta;

         Intb;

}TESET_STRTUCT

Typedef enum

{

         A,

B,

C      

};

[6]c語言中,#define NULL 0 所有,将0或NULL賦給一個指針變量時,不能使用該指針指向的記憶體的内容。是以free(NULL)很危險,不行。

c語言通路存儲時常見錯誤:

間接引用壞指針;

讀未初始化的存儲器;

允許棧緩沖區溢出;

假設指針和它們指向的對象是相同的大小;

位址不對齊錯誤;

引用指針,而不是它指向的對象;

誤解指針運算;

引用不存在的變量;

引用空閑堆塊中的資料;

儀器存儲器洩漏。