C语言常见问题与解答

需积分: 0 1 下载量 16 浏览量 更新于2024-08-01 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是由Steve Summit原著,朱群英和孙云翻译的C语言问题集,旨在帮助读者理解和解决C语言编程中的常见问题。该文档包含了从声明和初始化到结构、联合和枚举等多个主题的详细解答,适合C语言学习者和开发者参考。 1. 在C语言中,选择整数类型通常取决于你需要存储的数值范围。例如,`int`通常用于常规计算,`short`在内存有限的环境中使用,而`long`或`long long`用于表示更大的整数。 2. 64位机上的64位类型如`long`或`int64_t`是专门为处理64位数值而设计的,它们可以存储更大的整数,适应64位架构的需求。 3. 全局变量和函数的最佳定义与声明应该遵循清晰和一致的命名规则,避免名字冲突,并在需要的地方使用`extern`关键字来指示变量或函数是在其他文件中定义的。 4. `extern`在函数声明中表明该函数是在别的源文件中定义的,这里只是告知编译器函数的存在,而实际的函数体在别处。 5. `auto`关键字在现代C++中已不再常用,但在C语言中,它用于指定局部变量的存储类别,意味着变量的生命周期仅限于其所在的块。 6. C语言中,结构是可以包含指向自身的指针的。在示例的typedef语句中,结构体NODEPTR包含一个指向自身类型的指针,这用于创建链表等数据结构。 7. 解析复杂声明的关键是阅读声明从右向左,先看变量,再看它的类型。例如,一个返回指向字符的指针的函数的指针数组,可以理解为“数组中的每个元素都是一个函数,这个函数返回一个字符指针”。 8. 如果函数只定义了一次,但编译器报非法重定义的错误,可能是因为函数在多个文件中被声明,但只在一个文件中定义,需要使用`extern`关键字在其他文件中声明函数,而不是再次定义。 9. `main()`函数的标准定义是`int main(void)`或`int main(int argc, char *argv[])`。`void main()`不是标准C的语法,虽然在某些编译器中可能接受。 10. 未初始化的变量的初始值是不确定的,不应依赖其默认为零。全局变量在未明确初始化的情况下可能含有零值,但不保证是空指针或浮点零。 11. 字符数组`a[]`在声明时必须有足够的空间容纳字符串,如`char a[12] = "Hello,world!";`。否则,编译器无法确定足够的内存空间。 12. `malloc()`返回的是未初始化的内存,因此不能直接用作字符串初始化。应使用`strcpy()`或`memcpy()`将字符串复制到分配的内存中。 13. 字符串常量和字符数组之间的主要区别在于字符串常量是不可修改的,而字符数组可以。尝试修改`p[i]`可能导致未定义行为,因为`p`可能是指向只读内存的指针。 14. 初始化函数指针可以使用函数名,如`typedef void (*func_ptr)(int); func_ptr my_func = my_function;`其中`my_function`是函数名。 接下来的章节会深入讨论结构、联合和枚举,包括如何声明和使用它们,以及如何实现抽象数据类型和模拟面向对象特性。此外,还会涵盖关于嵌套结构、匿名结构、动态内存管理、指针和类型转换等方面的问题。" 这个资源为C语言学习者提供了丰富的知识库,解答了C语言编程中常见的困惑,有助于提升编程技能和理解深度。