高质量编程指南读书笔记
运算符的优先级
单目运算符(++,sizeof,->)--算术运算符(+ * &)--位操作(>> >= & |)--逻辑操作(&& ||)
程序员的习惯
一般将目的参数放在前面,源参数放在后边
如果参数是指针且做输入使用,加const,防止该指针在函数体内被意外修改
void StringCopy(char *strDestination,const char *strSource);
函数管好出口和入口,入口参数判断,
常见内存错误
1,分配未成功,即使用(入口参数【assert(p!=NULL)】,malloc申请【if(p==NULL)】)
2,分配成功,未初始化即引用
3,分配成功并初始化,越界操作(多1少1)
4,忘记释放内存,造成内存泄露(申请释放必须配对)
5,已释放,却仍然使用(释放后设置为NULL,防止野指针)
---------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------
-----------------------------------------------------------------
编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
free()到底干了什么????????????
操作系统回收该段空间,把该空间放到可用链表中,内容可能还没有改变,但是程序已经不能访问啦(未知内容)