C语言经典问题解答

需积分: 9 1 下载量 137 浏览量 更新于2024-09-09 收藏 120KB PDF 举报
C语言经典问题解析 在C语言编程中,经常会遇到一些常见的问题和易错点,本文将对这些问题进行详细的解析和分析。 1. 初始化的问题 静态或非局部变量的初始化式中不能包含函数调用,因为静态变量的地址必须在编译过程中确定下来,而malloc()申请的内存地址是在运行时确定的。这是因为函数调用只能出现在自动变量(即局部非静态变量)的初始式中。 2. 指针的自增问题 在C语言中,后缀++和--操作符的优先级高于前缀一目操作符,因此*p++和*(p++)等价,它自增p并返回p自增之前所指向的值。如果要自增p指向的值,使用(*p)++,如果副作用的顺序无关紧要也可以使用++*p。 3. 指针类型转换的问题 在C语言中,类型转换意味着“把这些二进制位看作另一种类型,并作相应的对待”;这是一个转换操作符,根据定义它只能生成一个右值(rvalue)。而右值既不能赋值,也不能用++自增。如果编译器支持这样的扩展,那么要么是一个错误,要么是有意作出的非标准扩展。 4. 空指针和未初始化指针的区别 空指针在概念上不同于未初始化的指针:空指针可以确保不指向任何对象或函数;而未初始化指针则可能指向任何地方。 5. 用0表示空指针的问题 根据语言定义,在指针上下文中的常数0会在编译时转换为空指针。也就是说,在初始化、赋值或比较的时候,如果一边是指针类型的值或表达式,编译器可以确定另一边的常数0为空指针并生成正确的空指针值。 在函数调用的上下文中生成空指针需要明确的类型转换,强制把0看作指针。例如,在Unix系统调用execl中,需要明确地将0转换为指针类型,否则编译器将其视为整数0。 这些问题都是C语言编程中常见的问题和易错点,了解和理解这些问题可以帮助程序员更好地编写C语言程序,避免常见的错误和BUG。