天天看点

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语言访问存储时常见错误:

间接引用坏指针;

读未初始化的存储器;

允许栈缓冲区溢出;

假设指针和它们指向的对象是相同的大小;

地址不对齐错误;

引用指针,而不是它指向的对象;

误解指针运算;

引用不存在的变量;

引用空闲堆块中的数据;

仪器存储器泄漏。