C语言编程常见问题解答

需积分: 10 8 下载量 123 浏览量 更新于2024-07-30 1 收藏 253KB PDF 举报
"《你必须知道的495个C语言问题》是关于C语言编程常见问题的集合,由Steve Summit原著,朱群英、孙云翻译,包含了声明与初始化、结构、联合和枚举等多个方面的知识点。" C语言是一门强大的编程语言,其简洁的语法和对底层操作的直接支持使得它在软件开发中广泛应用。本资源主要讨论了声明和初始化方面的问题,让我们逐一解析这些关键点: 1. **选择整数类型**:C语言提供了多种整数类型,如`int`, `short`, `long`, `long long`等。开发者应根据需求选择合适的数据类型,考虑存储大小和数值范围。在64位机器上,`long`通常为64位,但并不总是如此,具体取决于编译器和平台。 2. **64位类型的表示**:在64位系统中,64位类型如`long long`通常是64位宽,但`long`的宽度可能仍为32位,这取决于编译器标准遵循的是ILP32(32位整数、长度、指针)还是LP64(64位长度和指针)模型。 3. **全局变量和函数的声明与定义**:全局变量和函数的声明通常放在头文件中,供其他源文件包含使用;定义则在源文件中,确保每个变量和函数只有一个定义。使用`extern`关键字在不提供定义的地方声明变量或函数。 4. **extern在函数声明中的意义**:`extern`关键字表明变量或函数的定义在其他地方,提醒编译器该实体是在其他源文件中定义的。 5. **关键字auto的用途**:在C99标准之前,`auto`用于声明局部变量。但在现代C++和C中,`auto`用于类型推断,简化变量声明。在C语言中,它的使用已变得不那么常见。 6. **链表的定义**:在C语言中,结构体可以包含指向自身的指针,以创建递归数据结构,如链表。示例中的错误可能是由于语法错误或未正确理解链表结构导致的。 7. **复杂声明的理解**:理解复杂声明的关键在于从右向左读取,先看变量,然后是其类型。例如,一个数组,其元素是函数指针,该函数返回指向字符的指针,可以写作`int (*(*arr)[N])(char*)`。 8. **非法重定义函数**:函数只能被定义一次。如果编译器报出重复定义的错误,检查是否有多余的函数定义或者包含文件被错误地包含多次。 9. **main函数的定义**:标准的`main()`函数定义是`int main(void)`或`int main(int argc, char *argv[])`。`void main()`不是标准C的写法,但某些编译器可能会接受。 10. **未初始化变量的默认值**:未初始化的局部变量的值是不确定的,不应依赖它们。全局变量的初始值可能是零,但不是总是如此,不能作为默认的空指针或浮点零。 11. **字符串初始化**:`char a[]="Hello,world!";`是初始化数组的正确方式,而不能在函数内部定义字符串字面量。 12. **动态内存分配**:`char *p=malloc(10);`分配了10个字节的内存,但`p`本身未初始化。要将其初始化为指向这段内存,需使用`p = (char*)malloc(10)`。 13. **字符数组与字符串字面量的区别**:`char a[]="stringliteral";`将字符串字面量复制到数组中,可以修改;`char *p="stringliteral";`创建了一个指向只读内存的指针,尝试修改会导致程序崩溃。 14. **函数指针的声明与初始化**:声明函数指针后,可以用`=NULL`或函数地址进行初始化,如`myFunctionType myPointer = myFunction;`。 这些问题展示了C语言的一些基本概念,理解和掌握这些将有助于编写更有效和可靠的C代码。学习C语言时,熟悉这些常见问题和解决方法至关重要。