-
你必须知道的495个C语言问题.pdf 非扫描版 清晰下载
资源介绍
目录
i
前言
xvii
1
声明和初始化
1
1.1
我如何决定使用那种整数类型? . . . . . . . . . . . . . . . . . . .
1
1.2
64 位机上的 64 位类型是什么样的?
. . . . . . . . . . . . . . . .
1
1.3
怎样定义和声明全局变量和函数最好? . . . . . . . . . . . . . . .
2
1.4
extern 在函数声明中是什么意思?
. . . . . . . . . . . . . . . . .
2
1.5
关键字 auto 到底有什么用途?
. . . . . . . . . . . . . . . . . . .
2
1.6
我似乎不能成功定义一个链表。我试过 typedef struct { char
*item; NODEPTR next; } *NODEPTR; 但是编译器报了错误信
息。难道在C语言中一个结构不能包含指向自己的指针吗? . . . .
3
1.7
怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返
回指向字符的指针的函数的指针的数组? . . . . . . . . . . . . . .
3
1.8
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。 . .
4
1.9
main() 的正确定义是什么? void main() 正确吗? . . . . . . . . .
4
1.10
对于没有初始化的变量的初始值可以作怎样的假定?如果一个全
局变量初始值为 “零”, 它可否作为空指针或浮点零? . . . . . . .
4
1.11
代码 int f() { char a[] = "Hello, world!";} 不能编译。 . . . . . . .
5
1.12
这样的初始化有什么问题?char *p = malloc(10); 编译器提示 “非
法初始式” 云云。 . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.13
以下的初始化有什么区别?char a[] = "string literal"; char *p =
"string literal"; 当我向 p[i] 赋值的时候, 我的程序崩溃了。 . . . .
5
1.14
我总算弄清除函数指针的声明方法了, 但怎样才能初始化呢?
. .
5
2
结构、联合和枚举
7
2.1
声明 struct x1 { ...}; 和 typedef struct { ...} x2; 有什么不同? .
7
2.2
为什么 struct x { ...}; x thestruct; 不对? . . . . . . . . . . . . .
7
2.3
一个结构可以包含指向自己的指针吗? . . . . . . . . . . . . . . .
7
2.4
在 C 语言中实现抽象数据类型什么方法最好?
. . . . . . . . . . .
7
2.5
在 C 中是否有模拟继承等面向对象程序设计特性的好方法? . . .
7
i
目录
ii
2.6
我遇到这样声明结构的代码: struct name { int namelen; char
namestr[1];}; 然后又使用一些内存分配技巧使 namestr 数组用起
来好像有多个元素。这样合法和可移植吗? . . . . . . . . . . . .
8
2.7
是否有自动比较结构的方法? . . . . . . . . . . . . . . . . . . . .
8
2.8
如何向接受结构参数的函数传入常数值? . . . . . . . . . . . . . .
8
2.9
怎样从/向数据文件读/写结构? . . . . . . . . . . . . . . . . . . .
9
2.10
我的编译器在结构中留下了空洞, 这导致空间浪费而且无法与外
部数据文件进行 ”二进制” 读写。能否关掉填充, 或者控制结构域
的对齐方式? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.11
为什么 sizeof 返回的值大于结构的期望值, 是不是尾部有填充? . .
9
2.12
如何确定域在结构中的字节偏移?
. . . . . . . . . . . . . . . . .
9
2.13
怎样在运行时用名字访问结构中的域? . . . . . . . . . . . . . . .
10
2.14
程序运行正确, 但退出时却 “core dump”了,怎么回事? . . . . .
10
2.15
可以初始化一个联合吗? . . . . . . . . . . . . . . . . . . . . . . .
10
2.16
枚举和一组预处理的 #define 有什么不同?
. . . . . . . . . . . .
10
2.17
有什么容易的显示枚举值符号的方法? . . . . . . . . . . . . . . .
11
.
.
.
.
.
7
内存分配
35
7.1
为什么这段代码不行?char *answer; printf("Type something:\n");
gets(answer); printf("You typed \"%s\"\n", answer); . . . . . . .
35
7.2
我的strcat()不行.我试了char *s1 = "Hello, "; char *s2 = "world!";
char *s3 = strcat(s1, s2); 但是我得到了奇怪的结果。 . . . . . . .
35
7.3
但是 strcat 的手册页说它接受两个 char * 型参数。我怎么知道
(空间) 分配的事情呢? . . . . . . . . . . . . . . . . . . . . . . . .
36
7.4
我刚才试了这样的代码 char *p; strcpy(p, "abc"); 而它运行正
常?怎么回事?为什么它没有崩溃? . . . . . . . . . . . . . . . .
36
7.5
一个指针变量分配多少内存? . . . . . . . . . . . . . . . . . . . .
36
7.6
我有个函数, 本该返回一个字符串, 但当它返回调用者的时候, 返
回串却是垃圾信息。 . . . . . . . . . . . . . . . . . . . . . . . . .
36
目录
v
7.7
那么返回字符串或其它集合的争取方法是什么呢?
. . . . . . . .
37
7.8
为什么在调用 malloc() 时, 我得到 “警告: 整数赋向指针需要类型
转换”? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
7.9
为什么有些代码小心地把 malloc 返回的值转换为分配的指针类型。 37
7.10
在调用 malloc() 的时候, 错误 “不能把 void * 转换为 int *” 是什
么意思? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
7.11
我见到了这样的代码 char *p = malloc(strlen(s) + 1); strcpy(p,
s); 难道不应该是 malloc((strlen(s) + 1) * sizeof(char))? . . . . .
37
7.12
我如何动态分配数组? . . . . . . . . . . . . . . . . . . . . . . . .
38
7.13
我听说有的操作系统程序使用的时候才真正分配 malloc 申请的内
存。这合法吗? . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
7.14
我用一行这样的代码分配一个巨大的数组, 用于数字运算: double
*array = malloc(300 * 300 * sizeof( double )); malloc() 并没有返
回 null, 但是程序运行得有些奇怪, 好像改写了某些内存, 或者
malloc() 并没有分配我申请的那么多内存, 云云。 . . . . . . . . .
38
7.15
我的 PC 有 8 兆内存。为什么我只能分配 640K 左右的内存?
. .
38
7.16
我的程序总是崩溃, 显然在 malloc 内部的某个地方。但是我看不
出哪里有问题。是 malloc() 有 bug 吗? . . . . . . . . . . . . . . .
38
7.17
动态分配的内存一旦释放之后你就不能再使用, 是吧?
. . . . . .
38
7.18
为什么在调用 free() 之后指针没有变空?使用 (赋值, 比较) 释放
之后的指针有多么不安全? . . . . . . . . . . . . . . . . . . . . .
39
7.19
当我 malloc() 为一个函数的局部指针分配内存时, 我还需要用
free() 明确的释放吗?
. . . . . . . . . . . . . . . . . . . . . . . .
39
7.20
我在分配一些结构, 它们包含指向其它动态分配的对象的指针。
我在释放结构的时候, 还需要释放每一个下级指针吗?
. . . . . .
39
7.21
我必须在程序退出之前释放分配的所有内存吗? . . . . . . . . . .
40
7.22
我有个程序分配了大量的内存, 然后又释放了。但是从操作系统
看, 内存的占用率却并没有回去。 . . . . . . . . . . . . . . . . . .
40
7.23
free() 怎么知道有多少字节需要释放?
. . . . . . . . . . . . . . .
40
7.24
那么我能否查询 malloc 包, 可分配的最大块是多大? . . . . . . .
40
7.25
向 realloc() 的第一个参数传入空指针合法吗?你为什么要这样做? 40
7.26
calloc() 和 malloc() 有什么区别?利用 calloc 的零填充功能安全
吗?free() 可以释放 calloc() 分配的内存吗, 还是需要一个 cfree()?
40
7.27
alloca() 是什么?为什么不提倡使用它? . . . . . . . . . . . . . .
41