"C语言常见问题集,包括声明与初始化、结构、联合和枚举等多个方面的常见疑问解答。"
本文档是C语言问题的汇总,由Steve Summit原著,并由朱群英和孙云进行了翻译和修订。它涵盖了从基础到进阶的各种问题,旨在帮助读者解决在学习和使用C语言过程中可能遇到的困扰。
1. 关于声明和初始化的问题:
- 如何选择合适的整数类型,取决于你需要存储的数值范围和效率要求。
- 在64位系统上,64位类型通常为`long`或`long long`,具体依赖于平台。
- 全局变量和函数的最好定义方式是先声明,后定义,避免名字冲突和作用域问题。
- `extern`在函数声明中表示该函数是在其他地方定义的,告诉编译器其存在。
- `auto`关键字在现代C语言中通常不再需要,它用于旧代码中的局部变量声明。
- 结构体可以包含指向自身的指针,只需正确处理指针类型即可。
- 复杂声明的理解需要掌握分层解析原则,从右到左读取并考虑括号内的类型。
- 非法重定义通常是由于多次定义同一函数或变量导致的,确保每个标识符的唯一性。
- `main()`函数的正规定义通常是`int main(void)`,`void main()`不是标准定义。
- 未初始化的变量值是不确定的,全局变量默认不赋值,不能假设它们为零。
- 字符串字面量不能赋值给未初始化的指针,需分配内存并复制字符串。
- `char a[]="stringliteral"`是字符数组,而`char *p="stringliteral"`是字符指针,对后者修改可能导致未定义行为。
- 函数指针的声明和初始化涉及类型匹配,初始化时需指定其指向的函数类型。
2. 结构、联合和枚举的问题:
- 声明`struct x1{};`和`typedef struct {} x2;`的区别在于,前者创建了一个结构类型,后者创建了一个别名。
- `struct x{}; x theStruct;`不正确是因为结构类型声明后需要使用`struct`关键字来实例化。
- 结构体可以包含指向自身的指针,用于实现递归结构或自引用。
- 在C语言中实现抽象数据类型通常通过结构体和指针结合,以及内部实现的私有接口。
- C语言本身不支持面向对象编程,但可以通过模拟(如结构体和函数指针)实现类似功能。
- 声明`struct name`时,`namestr[1]`是动态大小的字符串表示,通过`name.namelen`来确定实际长度。
文档还涵盖了更多其他问题,如位字段、指针运算、内存管理、预处理器、类型转换、错误处理等方面,提供了深入的解释和示例,对于C语言学习者和开发者来说是一份宝贵的参考资料。