C语言经典问题解析:从全局变量到结构自指详解

需积分: 29 7 下载量 165 浏览量 更新于2024-07-31 收藏 1.34MB PDF 举报
《你必须知道的495个C语言问题》是一本针对C语言初学者和进阶开发者编写的实用指南,由Steve Summit原著,朱群英和孙云翻译。该书详细解答了C语言中的常见问题,覆盖了从基础语法到高级概念的广泛内容。以下部分摘录了几个关键知识点: 1. 整数类型选择: - 学习者应考虑项目需求、性能优化和内存占用,选择合适的整数类型(如`int`, `short`, `long`, 或`long long`),尤其是在不同平台(如64位机)上。 2. 全局变量与函数声明: - 声明全局变量和函数时,推荐使用`static`关键字来控制其作用域,避免意外的命名冲突。使用`extern`关键字在不同文件间共享变量或函数定义。 3. `auto`关键字: - `auto`主要用来自动推断局部变量的存储类型,但在C语言中,现代编译器通常会默认为`auto`,因此了解其原始用途已不那么重要,但理解其历史和特殊情况仍有价值。 4. 链表定义与自引用: - 结构体中包含指向自身类型的指针可能造成无限递归,需要谨慎处理。这里提到的问题可能是关于如何正确地定义结构体指针,包括类型定义和指针声明。 5. 复杂声明的理解: - 对于复杂的数据结构声明,如指针数组,要理解其内存分配和操作方式,这涉及到指针算术和内存布局。 6. 函数重定义问题: - 函数只定义一次而被多次调用,但编译器报错,可能是因为重复定义了函数或没有正确处理静态/外部链接函数。 7. `main()`函数的规范: - `main()`函数的标准定义是`int main() { ... }`,`void main()`可能在某些编译器下工作,但并非标准,可能导致兼容性问题。 8. 未初始化变量: - 对于未初始化的变量,C语言没有强制规定初始值,但通常假设为零(对于整型)或未定义行为(对于其他类型)。全局变量若无明确赋值,一般默认为零或空指针。 9. 字符串常量和动态内存: - 字符数组常量`char a[] = "Hello, world!"`无法编译,因为常量的长度是固定的,而动态内存分配(如`malloc()`)允许可变大小。 10. 初始化问题: - `char *p = malloc(10)`报“非法初始式”错误,可能是因为忘记初始化指针或分配的内存不足。 11. 字符数组与指针的区别: - 字符数组`char a[]`与指针`char *p`虽然看似相似,但操作它们的方式和内存管理截然不同。向`p[i]`赋值可能导致越界,引发运行时错误。 12. 函数指针的声明和初始化: - 函数指针的声明通常包含函数返回类型和参数列表,初始化则涉及指向具体函数的地址。 13. 结构、联合和枚举: - `struct`和`typedef struct`的区别在于后者提供了别名,而`struct x {}`创建的是空结构体。联合允许不同类型的数据共享同一内存空间,而C中的继承概念需借助预处理器宏或外部库实现。 通过这本书,读者可以系统地学习和解决C语言中常见的疑惑,提升编程技能和代码质量。