C语言常见问题与解答合集

需积分: 9 2 下载量 180 浏览量 更新于2024-07-23 收藏 1.3MB PDF 举报
"495个C语言常见问题集是一份由Steve Summit原著,朱群英和孙云翻译的文档,包含了C语言学习中常见的495个问题和解答。这份资源旨在帮助C语言初学者和开发者解决实际编程过程中遇到的问题,涵盖了声明与初始化、结构、联合和枚举等多个主题。文档的最新修订版为0.9.4,发布于2005年6月23日。" 以下是部分问题的详细说明: 1.1 在选择整数类型时,应考虑其所需的存储空间和数值范围。通常,`int`是最常用的类型,适用于大多数情况。对于需要更大范围或更小存储空间的场景,可以使用`short`、`long`或`long long`。 1.2 在64位机器上,64位整型通常由`long`或`long long`表示。具体取决于编译器和平台的实现。建议查阅相应编译器的文档以获取确切信息。 1.3 定义全局变量和函数的最佳实践是尽量减少它们的使用,以降低作用域污染和潜在的命名冲突。在需要时,使用`extern`关键字在其他文件中声明它们。 1.4 `extern`在函数声明中表示该函数是在其他地方定义的,告知编译器这个函数存在,但不包含其实现。 1.5 `auto`关键字在现代C++中不再常用,它主要用于旧代码中,用来默认声明局部变量。在C99标准及以后的版本中,局部变量默认就是`auto`类型。 1.6 C语言允许结构体包含指向自身的指针。问题中的错误可能源于语法错误或对结构体指针的理解不足。确保正确地使用typedef和指针。 1.7 复杂声明的解析需要从右到左,逐级解开嵌套。对于复杂的类型如函数指针数组,要理解每一层的含义,最后组合起来。 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()`返回的是未初始化的内存,不能直接作为字符串初始化。需要使用`strcpy()`或其他方式复制字符串到动态分配的内存中。 1.13 `char a[]="stringliteral"`创建了一个字符数组并复制了字符串;`char *p="stringliteral"`是一个指向字符串字面量的指针,不能修改。试图修改`p[i]`会导致未定义行为。 1.14 函数指针的声明应包含其返回类型和参数类型。初始化函数指针时,需提供一个匹配的函数地址。 2.1 `struct x1{}`声明了一个结构类型,而`typedef struct {} x2;`创建了一个新的类型名`x2`,代表匿名结构。两者在使用时有所不同,后者可以避免重复的`struct`关键字。 2.2 `struct x {}; x theStruct;`的错误在于结构体类型需要使用`struct`关键字来声明变量。 2.3 结构体可以包含指向自身的指针,这在自引用结构和链表等数据结构中很常见。 2.4 在C语言中实现抽象数据类型,通常通过结构体和指向结构体的指针来隐藏实现细节,并通过一组函数(即接口)来操作这些类型。 2.5 C语言不支持直接的面向对象特性,但可以通过模仿,如结构体+函数指针的方式实现类似的功能,称为"结构化封装"或"模拟面向对象"。 这份问题集覆盖了C语言的基础和进阶主题,是深入理解和解决问题的宝贵资源。