C语言常见问题与解答

需积分: 0 2 下载量 184 浏览量 更新于2024-10-23 收藏 976KB PDF 举报
"495个C语言问题 -从网上转载" 这篇文档是一个收集了495个关于C语言编程的问题和解答的资源,旨在帮助学习者解决他们在C语言编程过程中遇到的常见问题。由Steve Summit原著,朱群英和孙云翻译,并在2005年6月23日更新到了修订版0.9.4。内容涵盖了声明与初始化、结构、联合和枚举等多个主题。 1. **声明和初始化** - **问题1.1** 关于整数类型的选取,应考虑目标平台的位宽和性能需求。通常,`int`是默认的整数类型,但在不同的系统上,它的大小可能会有所不同。`long`和`long long`用于表示更大的整数,而`short`则用于节省空间。 - **问题1.2** 在64位系统上,64位整型如`long`或`long long`通常占据8个字节。然而,这取决于具体编译器和标准遵循的情况。 - **问题1.3** 全局变量和函数的最佳声明通常是在文件的开头,而定义应在需要它们的地方,以减少作用域污染和提高可读性。 - **问题1.4** `extern`关键字在函数声明中表示该函数是在其他地方定义的,告诉编译器函数的存在,但不提供实现。 - **问题1.5** `auto`关键字在函数内部用于声明局部变量,但现代C++中已很少使用,因为这是默认的行为。 - **问题1.6** 结构体可以包含指向自己的指针,但需要注意递归定义和内存分配的问题,这里的问题可能出在typedef的使用上。 - **问题1.7** 声明复杂类型时,需要理解指针、数组和函数之间的关系。例如,一个指向返回字符指针的函数的指针的数组,可以写作`(int (*)(char*)) (*)[N]`。 - **问题1.8** 函数重定义可能是由于头文件被多次包含,需使用`#ifndef`预处理指令避免。 - **问题1.9** `main()`的合法定义包括`int main(void)`和`int main(int argc, char *argv[])`。`void main()`不完全符合C标准。 - **问题1.10** 未初始化的变量值是不确定的,不能假设它们是零。全局变量的默认值不是零,而是未定义的。 - **问题1.11** 字符串字面量不能被直接赋给非静态字符数组,因为字符串字面量是常量。 - **问题1.12** `malloc()`返回的是未初始化的内存,需要显式初始化。`char *p = malloc(10)`之后,`p`只是一个指向内存块的指针,不能直接赋值。 - **问题1.13** `char a[]="stringliteral"`创建了一个字符数组并复制了字符串;`char *p="stringliteral"`是一个指向字符串字面量的指针,尝试修改p[i]会导致未定义行为。 - **问题1.14** 初始化函数指针需要提供匹配的函数类型。例如,`typedef int (*func_ptr)(int); func_ptr my_ptr = my_function;`。 2. **结构、联合和枚举** - **问题2.1** `struct x1{}`声明了结构类型`x1`,而`typedef struct {} x2;`将匿名结构体类型命名为`x2`,两者都是创建新类型的方式,但后者更便于使用。 - **问题2.2** `struct x{}; x the_struct;`是错误的,因为`x`在这里是一个未声明的类型。应该使用`struct x the_struct;`。 - **问题2.3** 结构体可以包含指向自身的指针,这在实现递归数据结构如链表、树等时很有用。 - **问题2.4** 实现抽象数据类型(ADT)通常通过结构体和指向结构体的函数指针来隐藏实现细节,以达到信息隐藏。 - **问题2.5** C语言不支持原生的面向对象特性,但可以通过模仿类的概念,如使用结构体和指向成员函数的指针来实现类似的功能。 这些问题是C语言初学者和有经验的程序员都可能遇到的挑战,理解这些问题的答案有助于提高C语言编程技能。文档中的其他问题会涉及更多的主题,如指针操作、内存管理、类型转换以及预处理器宏等。通过深入学习和实践,程序员能够更好地掌握C语言的核心概念和最佳实践。