C语言编程常见问题解答

5星 · 超过95%的资源 需积分: 31 7 下载量 192 浏览量 更新于2024-07-27 收藏 1.34MB PDF 举报
"《你必须知道的495个C语言问题》是针对C语言编程者的一本问题集,由Steve Summit原著,朱群英和孙云翻译,并在2005年6月23日修订至0.9.4版。这本书涵盖了C语言中的常见问题,包括声明和初始化、结构、联合和枚举等多个方面,旨在帮助开发者解决实际编程中可能遇到的困惑和错误。 1. 在C语言中,选择整数类型时,应考虑需要的数值范围和效率。例如,int通常适用于大多数情况,long int用于需要更大范围的整数,而short int则用于节省内存。 2. 在64位系统上,64位类型如long int通常是64位的,但具体取决于编译器和平台的实现。 3. 全局变量和函数的最佳定义与声明通常应避免使用extern关键字,除非在多个源文件之间共享。在头文件中声明,在实现文件中定义,可以避免命名冲突和链接错误。 4. extern在函数声明中表示该函数是在其他地方定义的,告诉编译器函数的存在,但不提供函数体。 5. 关键字auto在现代C语言中主要用于旧代码,通常在函数作用域内自动声明变量,现在已被默认采用。 6. 链表定义可以通过typedef简化,但要注意自引用类型,如typedef struct Node { char *item; Node *next; } Node;正确创建链表结构。 7. 声明复杂类型时,遵循从右到左的规则,例如,一个指向返回指针数组的函数的指针的声明。理解这种声明需要熟悉C语言的类型规则。 8. 函数不能重复定义,若在同一作用域内多次定义,会导致编译错误。正确做法是只定义一次,多次声明。 9. main()的正确定义通常是int main(void),void main()不是标准C的写法,但在某些编译器中可能接受。 10. 未初始化的变量值是不确定的,不应依赖其初始值。全局变量默认不会被初始化为零,而是随机值。空指针和浮点零的零初始化需要显式指定。 11. 字符数组必须有足够的空间来容纳字符串,如int f() { char a[] = "Hello, world!"; }需要足够的空间存储字符串和结束的空字符。 12. char *p = malloc(10);是动态分配内存,需要在使用前初始化,如p = malloc(10); *p = 'H';。 13. char a[] = "stringliteral"; 是字符串字面量,不可修改;char *p = "stringliteral";是指向常量字符串的指针,尝试修改p[i]会导致未定义行为。 14. 初始化函数指针需要指明其指向的函数类型,例如,int (*func_ptr)(int) = some_function;。 15. 结构、联合和枚举是C语言的重要部分。结构可以包含指向自身的指针,实现递归结构。typedef可以简化结构类型的使用,但struct x1{};和typedef struct {} x2;有区别,前者定义了一个结构类型,后者创建了一个别名。 16. 结构可以包含指向自身的指针,用于构建自引用的数据结构,如链表、树等。 17. C语言不支持面向对象编程的特性,如继承,但可以通过结构嵌套和函数指针模拟类似行为。 这些问题的解答揭示了C语言的一些核心概念和陷阱,对于提升C语言编程能力大有裨益。通过理解和掌握这些问题,开发者能更好地编写高效、可靠的C语言代码。"