# notes-on-c-expert-programming **Repository Path**: aspcc/notes-on-c-expert-programming ## Basic Information - **Project Name**: notes-on-c-expert-programming - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-19 - **Last Updated**: 2021-03-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 《C语言专家编程》笔记 1. 尽量不使用 unsigned (P24) 为了防止隐式类型转换导致的容易忽视的错误结果,不应使用 unsigned 类似,即使数据是大于 0 的数。 诸如 strlen 等返回 unsigned 类型的函数,如果能保证不超出范围,在使用前应加上 (int) 进行类型转换。 如果非要使用,得加上 (unsigned) 强制转换。 2. malloc(sizeof(str)) 是错误用法 (P28) malloc(sizeof(str)+1) 才是正确用法,因为很容易忽视 '\0' 字符。(问就是语言特性) 3. 使用 static 使变量或函数对其他文件不可见 (P36) void sum(int a, int b); // 任何文件可见 static void sum(int a, int b); // 仅本文件可见 4. 用 fgets 代替 gets 函数 (P42) 一般情况下,需要获取输入的变量空间分配在堆栈段,而 gets 函数在读取用户输入时,并不会对用户输入值的长度进行限制,导致多余的内容会继续侵占变量旁的堆栈空间。 fgets 函数会严格限制用户输入内容大长度,故更安全。 5. 函数调用时的内存泄露问题 (P48) PS: 重点 6. #define 与 typedef 区别 (P68) 宏定义能够用自定义的类型说明符对宏类型名进行扩展,但对 typedef 定义的类型名无效 ```C #define peach int unsigned peach i; /* OK */ typedef int banana; unsigned banana i; /* Error */ ``` 在连续声明变量时,typedef 能保证声明中的所有变量类型相同,宏定义不能 ```C #define int_ptr int* int_ptr chalk, cheese; // 实际变为 int* chalk, cheese; // cheese 为 int ``` 目前看到 P69