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語言通路存儲時常見錯誤:
間接引用壞指針;
讀未初始化的存儲器;
允許棧緩沖區溢出;
假設指針和它們指向的對象是相同的大小;
位址不對齊錯誤;
引用指針,而不是它指向的對象;
誤解指針運算;
引用不存在的變量;
引用空閑堆塊中的資料;
儀器存儲器洩漏。