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语言访问存储时常见错误:
间接引用坏指针;
读未初始化的存储器;
允许栈缓冲区溢出;
假设指针和它们指向的对象是相同的大小;
地址不对齐错误;
引用指针,而不是它指向的对象;
误解指针运算;
引用不存在的变量;
引用空闲堆块中的数据;
仪器存储器泄漏。