C语言编程常见问题解答

需积分: 50 0 下载量 156 浏览量 更新于2024-07-23 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是关于C语言编程常见问题的集合,由Steve Summit原著,朱群英和孙云翻译,2005年的修订版为0.9.4。这本书涵盖了声明与初始化、结构、联合和枚举等多个方面的内容,旨在帮助读者解决在C语言编程中可能遇到的各种问题。 1.1 选择整数类型时,应考虑所需的数值范围以及效率。通常,int适用于大多数情况,long long用于需要大整数的情况,short用于节省空间但范围较小的情况。 1.2 在64位机上,64位类型如long或long long通常表示64位的整数。但请注意,这取决于具体的编译器和平台,因此最好查阅特定环境的文档。 1.3 全局变量和函数的最好定义方式是在头文件中声明,在一个单独的源文件中定义,以避免命名冲突和重复定义的问题。使用extern关键字在其他文件中声明全局变量,表示它们在其他地方已定义。 1.4 extern在函数声明中表示该函数已在其他地方定义,告诉编译器函数的存在,但不包含其实际实现。 1.5 auto关键字在C99标准以后已经失去其原有的作用,现在主要在旧代码中看到,用于局部变量的默认存储类别,但在C++中仍具有特定意义。 1.6 C语言允许结构体包含指向自身的指针。在本例中,typedef语句有误,应该是typedef struct { char *item; struct NODEPTR next; } NODEPTR;,其中struct NODEPTR next表示节点指针指向结构体自身。 1.7 使用递归声明可以帮助理解复杂类型,例如,解析一个函数指针数组,每个函数返回一个指向字符的指针。可以逐步分解,从最内层开始向外扩展。 1.8 函数的非法重定义通常是由于多次定义或未正确包含头文件导致的。确保使用预处理器指令#include来防止重复定义,并使用extern声明外部函数。 1.9 main()的正确定义通常是int main(void)或int main(int argc, char *argv[])。void main()虽然在某些情况下可能有效,但不是标准C的推荐做法。 1.10 未初始化的变量的值是不确定的,不应依赖其初始值。全局变量默认值不是“零”,除非显式初始化。空指针和浮点零是特定类型的零值,不能通过未初始化来假设。 1.11 字符串字面量不能直接赋给非静态字符数组,因为字符串字面量是常量,尝试修改会导致未定义行为。 1.12 malloc分配的内存需要进行初始化,例如通过strcpy将字符串复制到分配的内存中。只分配内存不赋值,编译器会报错,因为指针没有指向有效的字符串。 1.13 char a[]="stringliteral";是字符串字面量的拷贝,而char *p="stringliteral";是字符串字面量的引用。修改p[i]会崩溃,因为字符串字面量是只读的。 1.14 函数指针的声明要指定函数的返回类型和参数类型,初始化时需要提供匹配的函数指针。 2.1 声明struct x1{};创建了一个结构类型,而typedef struct {} x2;创建了名为x2的别名。前者需要使用struct关键字来实例化,后者可以直接用x2。 2.2 struct x{}; x theStruct;是错误的,因为结构体类型前缺少了typedef或struct关键字。 2.3 结构体可以包含指向自己的指针,这是创建递归数据结构的基础,如链表、树等。 2.4 实现抽象数据类型(ADT)通常涉及使用结构体和指向结构体的指针,以及定义操作这些数据类型的函数。 2.5 C语言不具备原生的面向对象特性,但可以通过封装、结构体和函数指针模仿面向对象编程的概念,如模拟类和继承。 以上是《你必须知道的495个C语言问题》中部分章节的详细解释,这本书为C语言学习者提供了丰富的参考资料,解答了许多常见的编程疑惑。