C语言常见问题与解答

需积分: 9 0 下载量 146 浏览量 更新于2024-07-26 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是关于C语言编程常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,2005年的修订版为0.9.4。这本书涵盖了从声明和初始化到结构、联合和枚举等多个方面的C语言知识,旨在帮助读者解决实际编程中遇到的问题。 1. 在选择整数类型时,应考虑所需的最大值、最小值以及存储空间效率。通常,`int`适合大多数情况,但针对特定需求,可以使用`short`(更小的空间)或`long`/`long long`(更大的范围)。 2. 在64位系统上,`long`通常是64位,但具体取决于具体的C语言实现和平台标准。确保了解所使用的编译器和平台的约定。 3. 全局变量和函数的声明应清晰明确,避免命名冲突和作用域混淆。一般建议先声明,后定义,且函数声明应在头文件中,实现放在源文件中。 4. `extern`关键字用于声明一个在其他地方定义的变量或函数,告知编译器该实体存在于别处。 5. `auto`关键字在C99之后的版本中不再常用,主要用于旧代码,表示局部变量的存储类别。现代C代码通常不需显式使用`auto`。 6. 链表定义中的typedef可以创建一个新的类型名,但这里的问题可能是未正确声明结构体,导致编译错误。正确做法是在typedef之前声明结构体。 7. 解读复杂声明的关键是自右向左读取,例如,一个函数指针数组,返回一个指向字符的指针,应从最内层的类型(字符指针)开始向外读。 8. 非法重定义通常是由于多次声明或定义了相同名称的函数或变量,确保每个实体在作用域内仅声明一次。 9. `main()`的合法定义包括`int main(void)`、`int main(int argc, char *argv[])`。`void main()`不是标准C定义,但某些编译器可能接受。 10. 未初始化的变量的值是不确定的,不应依赖其默认为零或任何特定值。全局变量在未初始化的情况下,内存中的值可能是任意的,包括空指针和浮点零。 11. 字符数组的初始化必须在声明时提供大小,例如`char a[] = "Hello, world!";`,因为字符串常量的长度是固定的。 12. `malloc()`返回的是未初始化的内存,因此`char *p = malloc(10);`后需要使用`strcpy`或其他方式赋值,直接赋字符串常量会导致错误。 13. 字符串字面量和字符数组的区别在于,字符串字面量是不可修改的,而字符数组可以。尝试修改`p[i]`会导致未定义的行为。 14. 函数指针的声明和初始化通常涉及函数的返回类型、参数列表和指针名称,如`typedef int (*func_ptr)(int, int); func_ptr my_func = some_function;`。 15. 结构可以包含指向自身的指针,这是创建递归或自我引用数据结构的基础,如链表或树。 16. 抽象数据类型的实现通常通过结构体和指针操作来完成,隐藏内部细节,只暴露公共接口。 17. C语言本身并不支持面向对象编程(OOP),但可以通过结构体和函数指针模拟类和继承的概念。 这些问题只是书中的一部分,书中的其他章节还会涉及更多C语言的深度问题,如指针、内存管理、预处理器、输入输出、错误处理等方面,是C语言学习者的重要参考资料。"