这是新闻组comp.lang.c的常见问题目录,现将它翻译为中文,供大家参考。常见问题 及其回答分节放在同一目录下: http://www.math.pku.edu.cn/teachers/qiuzy/c/ 如果在阅读有关解释的原文时遇到不能理解的问题,请给我发email:qzy@math.pku.edu.cn, 我将尽快为那条解释附上一段中文翻译。 [Last modified February 7, 1999 by scs.] Section 1. 声明与初始化 Section 2. 结构, 联合, 和枚举 Section 3. 表达式 Section 4. 指针 Section 5. 空指针 Section 6. 数组和指针 Section 7. 存储分配 Section 8. 字符和字符串 Section 9. 布尔表达式和变量 Section 10. C 预处理程序 Section 11. ANSI/ISO 标准 C Section 12. Stdio 库 Section 13. 库函数 Section 14. 浮点数 Section 15. 变长度参数表 Section 16. 奇怪的问题 Section 17. 风格 Section 18. 工具与资源 Section 19. 系统依赖性 Section 20. 杂项 参考文献 致谢 Section 1. 声明与初始化 1.1: 怎样决定用哪一个整数类型? 1.4: 在可以支持64位类型的机器上,该类型是什么样的? 1.7: 什么是声明和定义全局变量的最好方式? 1.11: 在函数声明中的 extern 是什么意思? 1.12: 关键字 auto 有什么用? 1.14: 我不知道怎样定义一个链表结点,因为其中包含了一个指向它自己的指针. 1.21: 如何声明一个包含 N 个指针的数组,这些指针指向一种函数,函数返回指向 另一种返回字符指针的函数? 1.22: 如何声明一个函数,它返回一个指向这个函数本身类型的指针? 1.25: 我的编译抱怨说出现了非法的函数重新定义,但实际上这个函数只定义了一次。 1.30: 那些没有明显做初始化的变量,我可以对它们的初始值做什么假定? 1.31: 为什么不能用字符串初始化一个局部数组? 1.31b: "char *p = malloc(10);" 里有什么错? 1.32: char a[] = "string"; 和 char *p = "string"; 有什么不同? 1.34: 怎么能够将指针初始化到一个函数? Section 2. 结构, 联合, 和枚举 2.1: struct x1 { ... }; 和 typedef struct { ... } x2; 有什么不同? 2.2: 为什么 "struct x { ... }; x thestruct;" 不对? 2.3: 结构可以包含到它本身的指针吗? 2.4: 什么是在 C 里实现模糊 (抽象) 数据类型的最好方式? 2.6: 我看到一些代码,其中声明了一种结构,结构里有个只包含了一个元素的数 组,而在此之后对它做了某种诡异的分配,使其用起来像是具有多个元素的 数组。这种方式合法吗?可移植吗? 2.7: 我听说结构可以用于给变量赋值,可以传进传出函数,但是 K&R1 说不行. 2.8: 存在自动比较结构的方法吗? 2.10: 能否把常量值传给接受结构参数的函数? 2.11: 怎么能从数据文件读入一些结构,或向文件写出一些结构? 2.12: 能关掉结构的对齐功能吗? 2.13: 为什么 sizeof 对一个结构类型给出的大小比我预计的大一些? 2.14: 怎么能确定结构里某个域的偏移量? 2.15: 怎么能在运行的时候通过名字访问结构的域? 2.18: 我有一个程序,工作中都正确,但结束后却导致内核卸载(dumps core), 这是为什么? 2.20: 我能对联合进行初始化吗? 2.22: 一个枚举和一组 #defines 预处理命令有什么不同? 2.24: 有没有一种简单的方式以符号形式打印出枚举值? Section 3. 表达式 3.1: 为什么代码 "a[i] = i++;" 不能工作? 3.2: 在我的编译中,代码 "int i = 7; printf("%d\n", i++ * i++);" 输出 49. 如果不考虑求值顺序,它是否应该输出 56? 3.3: 代码 "int i = 3; i = i++;" 应该做什么? 3.3b: 这里是一个诡异的表达式: "a ^= b ^= a ^= b". 它不用临时变量就能够交换 a 和 b 的值。 3.4: 难道优先级和括号还不能决定求值的顺序吗? 3.5: 那么运算符 && 和 || 的情况又怎么样? 3.8: 什么是一个“序列点”(sequence point)? 3.9: 那么,给了 a[i] = i++; 虽然不知道 a[] 的那个单元被写,但是 i 确实被 加 1,这错不了吧? 3.12: 如果我不使用表达式的值,那么应该用 i++ 还是 ++i 做变量的增量? 3.14: 为什么代码 "int a = 1000, b = 1000; long int c = a * b;" 不行? 3.16: 我能把 ?: 用在赋值表达式的左边吗? Section 4. 指针 4.2: "char *p; *p = malloc(10);" 有什么错? 4.3: *p++ 是增加 p,还是增加 p 所指的东西? 4.5: 我想用一个 char * 指针一步步走过一些 ints,为什么写 "((int *)p)++;" 不行? 4.8: 我有一个函数,它接受一个指针参数,想通过这种办法对指针做初始化。但是 为什么在调用后指针却没有改变? 4.9: 能否用一个 void ** pointer 作为参数,使一个函数可以以引用的方式 接受一个一般的指针? 4.10: 我有一个函数接受一个 int 指针。我怎么能将一个常数,比如 5,传给函数? 4.11: C 语言有 "引用传递" 方式的参数吗? 4.12: 我看到通过指针调用函数的不同方法,这方面到底是怎么规定的? Section 5. 空指针 5.1: 这个臭名昭著的空指针到底是个什么东西? 5.2: 怎么在自己的程序里得到一个空指针? 5.3: 简写的指针比较 "if(p)" 总能正确检测空指针值吗? 5.4: 什么是 NULL,它是怎样 #define 的? 5.5: 在一个以非全零的二进制模式作为空指针的内部表示的机器上,NULL 应该如何定义呢? 5.6: 如果 NULL 定义为 "((char *)0)",传递未经强制转换的 NULL 的函数调用 就不能工作了吗? 5.9: 既然 NULL 和 0 作为空指针常量是等价的,我应该用哪一个呢? 5.10: 用 NULL 会不会不是好的选择,例如当 NULL 的值改变时? 5.12: 我用预处理宏 "#define Nullptr(type) (type *)0" 来帮助自己构造类型 正确的空指针。 5.13: NULL 保证就是 0,而空指针却不是,这难道不奇怪吗? 5.14: 为什么围绕空指针出现怎么多混乱? 5.15: 我完全搞糊涂了,根本没法理解所有有关空指针的东西。 5.16: 既然有这么多与空指针有关的混乱认识,为什么还要求它们在内部都简单地 表示为 0 呢? 5.17: 认真点说,真有什么实际计算机就是用非 0 表示空指针吗? 5.20: 运行时出现 "null pointer assignment" 错误是什么意思? Section 6. 数组和指针 6.1: 我在一个源文件里定义了 char a[6],在另一个里声明了 extern char *a. 为什么这样写不行呢? 6.2: 但我听说 char a[] 与 char *a 完全一样。 6.3: 那么在 C 里 "指针与数组的等价性" 是怎么回事? 6.4: 为什么在函数形式参数里数组和指针声明却可以互换? 6.7: 数组怎么会是左值,你又不能给它赋值? 6.8: 数组和指针的真正差别在哪里? 6.9: 有人给我解释说数组实际上就是一个常指针。 6.11: 我看到一些 "可笑" 代码,其中包含 "表达式" 5["abcdef"],在C里这怎么能合法呢? 6.12: array 和 &array 有什么不同? 6.13: 怎样声明一个到数组的指针? 6.14: 怎么能在运行中设置数组的大小? 6.15: 如何声明一个局部数组,其大小与一个作为参数传过来的数组一样? 6.16: 如何动态分配多维数组? 6.17: 可以用指针模拟一个开始下标不为 0 的数组吗? 6.18: 当我把一个二维数组传给一个要求指向指针的指针的函数时,我的编译程序抱怨起来 (出现错误信息)。 6.19: 怎么写函数,使它能接受在编译的时候不知道宽度的二维数组? 6.20: 怎么在把多维数组传给函数时,既能使用静态数组,也能使用动态分配的数组。 6.21: 为什么当数组是函数参数时,sizeof 不能正确报告它的大小? Section 7. 存储分配 7.1: 为什么 "char *answer; gets(answer);" 不行? 7.2: 我无法让 strcat() 工作。我试了 "char *s3 = strcat(s1, s2);",得到很奇怪 的结果。 7.3: strcat() 的手册页说它取两个 char * 参数,我怎么知道是否应该做分配存储? 7.3b: 我试了代码 "char *p; strcpy(p, "abc");",能行,为什么它不垮台? 7.3c: 一个指针变量分配多少存储? 7.5a: 我有一个函数,它应该返回一个字符串。而函数结束后返回串里却是垃圾。 7.5b: 什么是返回一个字符串的正确方法? 7.6: 为什么我在调用 malloc() 时得到 "warning: assignment of pointer from integer lacks a cast" 7.7: 为什么某些代码仔细地将由 malloc 返回的值强制到被分配类型的指针? 7.8: 为什么大量代码里在分配字符串时都不写乘以 sizeof(char)? 7.14: 我听说有的操作系统不实际分配存储,直到程序真的要使用时才做。这合法吗? 7.16: 我为做数值计算分配了一个大数组,这时 malloc() 的行为很奇怪。 7.17: 我的 PC有 8M 内存,为什么我只能 malloc 大概 640K 左右? 7.19: 我的程序垮台了,看起来是在 malloc 里面的什么地方。 7.20: 你不能在释放之后又使用这块动态分配的存储,不是吗? 7.21: 为什么在调用 free() 之后指针不是空? 7.22: 当我为一个局部指针调用了 malloc() 之后,还必须显式地 free() 它吗? 7.23: 当我释放了一个包含指针的动态分配的结构时,我还必须针对这些指针做释放吗? 7.24: 在程序退出前我必须释放所有分配的存储吗? 7.25: 为什么在我释放存储后,程序实际使用的存储量却没有减少? 7.26: free() 怎么知道要释放多少个字节? 7.27: 我可以询问 malloc 程序包,以设法确定一个分配块有多大吗? 7.30: 将空指针作为 realloc() 的第一个参数传给它合法吗? 7.31: calloc() 和 malloc() 的差别在哪里? 7.32: 什么是 alloca(),为什么不提倡使用它? Section 8. 字符和字符串 8.1: 为什么 "strcat(string, '!');" 不行? 8.2: 为什么测试 if(string == "value") 不能正确比较 string 和那个值? 8.3: 为什么我无法将字符串赋给字符数组? 8.6: 怎么能取得一个字符所对应的数值 (在一个字符集里)? 8.9: 为什么 sizeof('a') 不是 1? Section 9. 布尔表达式和变量 9.1: 在 C 里对布尔值应该用什么类型? 9.2: 如果一个内部的逻辑或关系运算符 "返回" 的不是 1,那又会怎么样? 9.3: 这里 p 是指针, 写 if(p) 合法吗? Section 10. C 预处理程序 10.2: 我有些灵巧的预处理宏,它们能让我把C代码写的像 Pascal. 你觉得如何? 10.3: 怎么写出交换两个值的一般性的宏? 10.4: 什么是写包含多个语句的宏的最好方式? 10.6: 什么是 .h 文件,我应该把什么放到这种文件里? 10.7: 在一个头文件里 #include 另一个是可以接受的吗? 10.8a: #include <> 和 #include "" 的差别在哪里? 10.8b: 头文件检索的完整规则是什么? 10.9: 在一个文件的最前面我得到了一些奇怪的语法错误信息,但那里看起来很好。 10.10b: 我为一个函数 #include 了头文件,但连接程序老是说它没有定义。 10.11: 我从那里可以找到缺少的头文件? 10.12: 怎么构造一个预处理 #if 表达式,使它能比较字符串? 10.13: sizeof 在预处理命令 #if 里能用吗? 10.14: 能在一个 #define 行里用一个 #ifdef,以便给某个定义两种不同方式? 10.15: 有关 typedef 有类似 #ifdef 的东西吗? 10.16: 用 #if 能检查字节顺序吗? 10.18: 怎样才能预处理某些代码,删除选出的条件编译,又不处理所有的东西? 10.19: 怎样列出所有预定义的标识符? 10.20: 我有些老代码,它用类似 "#define Paste(a, b) a/**/b" 的形式构造新标识 符,但现在不行了。 10.22: 消息 "warning: macro replacement within a string literal" 是什么意思? 10.23-4: 我在字符串字面量里使用宏参数遇到了麻烦,其中用了 `#' 运算符。 10.25: 我被自己想做的技巧性的预处理难住了,找不到做它的方法。 10.26: 能不能写出参数数目可以变动的宏? Section 11. ANSI/ISO 标准 C 11.1: 什么是 "ANSI C 标准"? 11.2: 怎样得到这个标准? 11.2b: 从哪里可以找到有关标准更新的信息? 11.3: 我的 ANSI 编译程序对于原型的浮点参数不匹配发出抱怨。 11.4: 能混合使用老风格和新风格的函数语法吗? 11.5: 为什么声明 "extern int f(struct x *p);" 给出了一个警告信息? 11.8: 为什么不能在初始式或数组维中使用 const 值? 11.9: "const char *p" 和 "char * const p" 的差别在哪里? 11.10: 为什么不能将 char ** 传递给一个要求 const char ** 的函数? 11.12a: main() 的正确声明是什么? 11.12b: 我能通过将 main() 声明为 void 去关闭讨厌的 "main returns no value" 信息吗? 11.13: main 的第三个参数 envp 又是什么? 11.14: 我相信声明 void main() 不会出问题,因为我没返回而是调用了 exit()。 11.15: 我用的书里总是写 void main()。 11.16: 写 exit(status) 真与以同样 status 从 main() 里返回一样吗? 11.17: 我怎么能让 ANSI "stringizing" (字串化)预处理运算符 `#' 去字串化宏的值而不是它的名字? 11.18: 信息 "warning: macro replacement within a string literal" 是什么意思? 11.19: 我从一些已经 #ifdeff 掉的行里得到了许多奇怪的错误信息。 11.20: 什么是 #pragmas ? 11.21: "#pragma once" 是什么意思? 11.22: char a[3] = "abc"; 合法吗? 11.24: 为什么我不能对 void * 指针做算术? 11.25: memcpy() 和 memmove() 的差别何在? 11.26: malloc(0) 会做什么? 11.27: 为什么 ANSI 标准不保证外部标识符6个不区分大小写的字符之外的部分能够 起作用? 11.29: 我的编译程序拒绝了一些最简单的测试程序,给出各种各样的语法错误。 11.30: 为什么有些 ANSI/ISO 标准库函数却说无定义,这确实是一个 ANSI 编译器。 11.31: 谁有工具能够把老风格的C程序转换到 ANSI C,或者能自动产生原型吗? 11.32: 为什么 frobozz-cc,不接受这个代码,它也说是依据 ANSI 的? 11.33: 在“有实现定义”,“不描述”和“无定义行为”之间有什么不同? 11.34: 我抗议 ANSI 标准把怎么多东西留下不加以定义。 11.35: 我刚在一个符合 ANSI 的编译器上试过一些被说成是没有定义的代码,得到的 都是我所预期的结果。 Section 12. Stdio 库 12.1: 代码 "char c; while((c = getchar()) != EOF) ..." 有什么毛病? 12.2: 下面代码为什么不行? while(!feof(infp)) { fgets(buf, MAXLINE, infp); fputs(buf, outfp); } 12.4: 我的程序里的提示信息和中间输出有时不能显示在屏幕上。 12.5: 我能一次读一个字符,而不等按 RETURN 键吗? 12.6: 怎么用 printf 打印一个 '%' 字符? 12.9: 既然 scanf() 对 double 必须用 %lf,怎么 printf() 可以用 %f? 12.9b: 我不知道一个 typedef 定义出的东西的基础类型是什么,那么应该用什么 printf 格式? 12.10: 怎么用 printf 实现一个变动宽度的输出域? 12.11: 怎么用逗号做数的千分位? 12.12: 为什么调用 scanf("%d", i) 不能工作? 12.13: 为什么代码 "double d; scanf("%f", &d);" 不能工作? 12.15: 如何用 scanf() 格式串描述变动宽度? 12.17: 当我用 scanf "%d\n" 从键盘读入数时,它看起来是一直停着直到我键入另一行输入。 12.18: 我用 scanf %d 读入一个数,而后用 gets() 读一个字符串,但看起来编译跳过了 对 gets() 的调用! 12.19: 我在 scanf() 失败时重新提示用户,但有时看起来是进入了无穷循环。 12.20: 为什么每个人都说别用 scanf()?那么我应该用什么呢? 12.21: 我怎么知道对一个任意的 sprintf 需要多少目标缓冲区空间?在用 sprintf() 时 怎么避免目标缓冲区的溢出? 12.23: 为什么每个人都说别用 gets()? 12.24: 为什么在一个 printf() 调用后 errno 包含 ENOTTY? 12.25: fgetpos/fsetpos 和 ftell/fseek 的差异何在? 12.26: fflush(stdin) 能从标准输入流中刷掉未读的字符吗? 12.30: 我试着在原来的位置更新一个文件,用 fopen 模式 "r+",但是不行。 12.33: 如何在程序里重新定向 stdin 或 stdout? 12.34: 在用过 freopen() 之后,我怎么重新得到原来的流? 12.36b: 怎么安排,才能一下子就输出到两个地方? 12.38: 怎么能正确地读入二进制文件? Section 13. 库函数 13.1: 怎么把数转换到字符串? 13.2: 为什么 strncpy() 不总写一个 '\0'? 13.5: 为什么某些 toupper() 对大写字母的行为很奇怪? 13.6: 怎么把一个字符串分割为空白字符划分的域? 13.7: 我需要一些代码做正则表达式和通配符匹配。 13.8: 我想用 qsort() 对一个字符串数组排序,用 strcmp() 作为比较函数,但不行。 13.9: 现在我想对一个结构的数组排序,但编译程序说我的比较函数与 qsort() 所要求 的类型不符。 13.10: 怎么对一个链接表排序? 13.11: 怎么对无法放入内存的许多数据进行排序? 13.12: 怎么在 C 程序里得到一天里的时间? 13.13: 怎么把一个 struct tm 或一个字符串转到一个 time_t? 13.14: 怎么做日历运算? 13.14b: C 有 2000 年问题吗? 13.15: 我需要一个随机数生成器。 13.16: 怎么得到某个特定范围里的随机数? 13.17: 每次我运行我的程序,为什么总从 rand() 得到同一个数序列? 13.18: 我需要随机的 true/false 值就写了 rand() % 2,得到的总是交替的 0, 1, 0, 1, 0... 13.20: 我怎么得到具有正规或高斯分布的随机数? 13.24: 我试着移植一个老程序,为什么对某些库函数得到 "undefined external" 错误? 13.25: 我得到一些错误信息,说某些库函数没有定义,实际上已经 #include 了正确的头文件。 13.26: 我得到一些错误信息,说某些库函数没有定义,实际上我有正确的库。 13.28: 连接程序说 _end 没有定义,这是什么意思? Section 14. 浮点数 14.1: 我把一个浮点变量置为 3.1,为什么 printf 将它打印成 3.0999999? 14.2: 为什么 sqrt(144.) 给我一个乱七八糟的数? 14.3: 我一直得到 "undefined: sin" 编译错误。 14.4: 我的浮点计算很奇怪,在不同机器上给出不同答案。 14.5: 什么是检测浮点量 "足够接近" 的好方法? 14.6: 怎么对数做四舍五入? 14.7: C 的指数运算符在哪里? 14.8: 预定义常量 M_PI 好象没有在 里。 14.9: 怎样检测 IEEE NaN 与其他特殊的值? 14.11: 什么是在 C 里实现复数的好方法? 14.12: 我想找一些数学库代码。 14.13: 我的 Turbo C 程序崩溃了,并说 "floating point formats not linked." Section 15. 变长度参数表 15.1: 我听说在调用 printf() 前必须 #include 。为什么? 15.2: 为什么 %f 在 printf() 里可以用于 float 和 double 参数? 15.3: 为什么函数原型无法预防 printf 参数不匹配的情况? 15.4: 如何写出参数个数允许变动的函数? 15.5: 怎么写函数,它以一个格式串以及可变数目的几个参数,与 printf() 类似, 而后把这些参数传给 printf(),让它做主要的工作? 15.6: 怎么写类似 scanf() 的函数并调用 scanf()做主要的工作? 15.7: 我有一个 ANSI 前的编译,没有 。这时我能做什么? 15.8: 怎么能发现函数实际调用时到底提供了多少参数? 15.9: 我的编译程序不让我说明 *只* 接受变动参数的函数。 15.10: 为什么 "va_arg(argp, float)" 不行? 15.11: 我无法让 va_arg() 从抽出指向函数的指针参数。 15.12: 怎么写函数,使它能有变动个数的参数,并将它们传给其他函数? 15.13: 怎么用一个运行中构造出的参数表去调用一个函数? Section 16. 奇怪的问题 16.1b: 我得到一大堆语法错,它们都没有意义,而且看起来我程序中的大部分都没有编译。 16.1c: 为什么我的过程调用不起作用? 16.3: 这个程序在还没有运行前就垮台了。 16.4: 我有个程序运行时看起来正确,但在退出时却垮台了。 16.5: 这个程序在一台机器上运行得很好,在另一台机器上却得到古怪的结果。 16.6: 为什么代码 "char *p = "hello, world!"; p[0] = 'H';" 会垮台? 16.8: "Segmentation violation"(段侵犯)是什么意思? Section 17. 风格 17.1: 什么是在 C 里最好得代码编排风格? 17.3: 代码 "if(!strcmp(s1, s2))" 的风格好吗? 17.4: 为什么有些人写 if(0 == x) 而不写 if(x == 0)? 17.5: 我浏览了一些代码,其中总将 (void) 放在每个 printf() 调用前面,为什么? 17.8: 什么是 "匈牙利记法"? 17.9: 从哪里可以找到 "Indian Hill Style Guide" 和其他代码编写标准? 17.10: 有些人说 goto 是魔鬼,绝不要使用它。这是不是太极端了? Section 18. 工具和资源 18.1: 我在寻找 C 开发工具 (交叉引用生成器, 代码美容器等)。 18.2: 我怎么能弄清这些恼人的 malloc 问题? 18.3: 什么是我能用的免费或者便宜的 C 编译器? 18.4: 我刚刚输入了这个程序,它的行为很奇怪。你能看看它有什么错吗? 18.5: 我怎么能关掉 "warning: possible pointer alignment problem" 消息,lint 对每个 malloc() 都产生它? 18.7: 从哪里可以得到符合 ANSI 的 lint? 18.8: ANSI 的函数原型难道没有宣告 lint 过时吗? 18.9: 网络上有一些 C 教学材料或其他资源吗? 18.10: 什么是学习 C 语言最好的书? 18.13: 从那里可以找到标准 C 库的源代码? 18.13b: 有在线的 C 参考手册吗? 18.13c: 从那里可以得到 ANSI/ISO C 标准? 18.14: 我需要分析和求值表达式的代码。 18.15: 从哪里可以得到 C 的 BNF 或 YACC 语法? 18.15b: 谁有可以让我用的 C 编译器的测试集? 18.15c: 哪里收集的有有用的代码片段和例子? 18.15d: 我需要能做多精度算术的代码。 18.16: 从哪里可以得到所有这些自由发布的程序的拷贝,如何得到它们? Section 19. 系统依赖性 19.1: 怎么能从键盘读单个的字符而不必得到按 RETURN 键? 19.2: 怎么能知道能够读的字符有多少,或者做一个不会被阻塞的读操作? 19.3: 怎么能显示一个百分比完成指示,使它能在当地做更新,或者显示一个 "旋钮式" 的进展指示器? 19.4: 如何清屏,以彩色打印下一字符,或者移动光标? 19.5: 如何读箭头键?功能键怎么办? 19.6: 怎样读鼠标? 19.7: 怎样做串行 ("通讯") 端口的 I/O? 19.8: 怎样直接输出到打印机? 19.9: 怎样能通过送换意序列(escape sequences)去控制终端或者其他设备? 19.10: 怎样做图形? 19.11: 怎样检查文件是否存在? 19.12: 怎样在没有把文件读入之前确定它的大小? 19.12b: 怎样找到文件修改的日期? 19.13: 怎样在以来位置缩短文件,而不完全清除它或重写它? 19.14: 怎样在一个文件的中间修改或者删除一行? 19.15: 怎样由一个已经打开的文件描述字重新找到文件的名字? 19.16: 怎样删除文件? 19.16b: 怎样复制文件? 19.17: 调用 fopen("c:\newdir\file.dat", "r") 有什么错? 19.18: 如何增加能够同时打开的文件的数目? 19.20: 怎样在 C 程序里读一个目录? 19.22: 怎样弄清还有多少可以用的内存? 19.23: 怎样分配大于 64K 的数组或者结构? 19.24: 错误信息 "DGROUP exceeds 64K" 是什么意思? 19.25: 怎样访问具有某个特定地址的存储区? 19.27: 怎样从一个 C 程序里调用另一个程序? 19.30: 怎样调用另一个程序并截取它的输出? 19.31: 程序如何能找到它被调用时到那个可执行文件的完整路径? 19.32: 怎样自动定位一个程序的配置文件,就在它的可执行文件的同一个目录里? 19.33: 一个进程怎样修改它的调用环境里的环境变量? 19.36: 怎么读进一个目标文件,而后跳到它里面的某些地址? 19.37: 如何实现延迟,或者对用户反应进行计时,用小于秒的分辨单位? 19.38: 如何捕获或者忽略例如 control-C 这样的键盘中断? 19.39: 怎样能得体地处理浮点异常? 19.40: 我怎么 ... 使用套接字?做网络?写客户/服务器应用? 19.40b: 我怎么... 使用 BIOS 调用?写 ISR?建立 TSR? 19.40c: 我试着编译一个程序,其中 "union REGS" 和 int86() 没有定义。 19.41: 但是我无法使用所有这些非标准的、具有系统依赖性的功能,因为我的程序必须是 ANSI 兼容的。 Section 20. 杂项 20.1: 如何从一个函数里返回多个值? 20.3: 如何访问命令行参数? 20.5: 如何写数据文件,使它可以在另一个有不同数据格式的机器上读出来? 20.6: 如何通过以字符串方式给出其名字的方式调用一个函数? 20.8: 如何实现二进制位的集合或者数组? 20.9: 如何确定一个机器的字节顺序是高尾端(big-endian)还是低尾端(little-endian)? 20.10: 如何将整数转为二进制或者十六进制? 20.11: 我能否用以2为基的常量 (例如 0b101010)?printf() 提供了二进制格式吗? 20.12: 统计在一个整数里二进制位的个数的最有效方法是什么? 20.13: 什么是提高程序效率的最好方法? 20.14: 指针真的比数组快吗?函数调用将使速度慢多少? 20.15b: 人们都说优化编译好,可是我的编译甚至不能将 i/=2 换为一个移位操作。 20.15c: 任何能不用临时变量而交换两个值? 20.17: 有什么方法能够基于字符串做开关(switch语句)? 20.18: 是否有办法用非常量作为 case 标号 (例如,区间,或者任意表达式)? 20.19: return 语句最外面的括号是可选的吗? 20.20: 为什么 C 的注解不能嵌套?注解放在字符串里合法吗? 20.20b: a+++++b 是什么意思? 20.24: 为什么 C 不能有嵌套的函数? 20.24b: 什么是 assert()? 20.25: 我怎么从C里面调用 FORTRAN (C++, BASIC, Pascal, Ada, LISP) 函数? 20.26: 谁知道有程序能把 Pascal 或者 FORTRAN 转换到 C? 20.27: C++ 是 C 的一个超集吗?我能用 C++ 编译程序来编译 C 代码吗? 20.28: 我需要比较两个字符串是否接近,但又不必恰好相同。 20.29: 什么是散列(哈希)? 20.31: 如何由给定的日期确定它是星期几? 20.32: 2000 年是闰年吗? 20.34: 怎样写一个程序,它能输出其自身的源代码? 20.35: 什么是 "Duff 设施" (Duff's Device)? 20.36: 下一次最难懂的C代码竞赛(Obfuscated C Code Contest)在什么时候举办? 如何能得到以前胜出的那些项目? 20.37: 什么是 K&R1 里提到的 entry 关键字? 20.38: 名字 "C" 从何而来? 20.39: 你怎么念 "char"? 20.39b: 左值(lvalue)和右值(rvalue)是什么意思? 20.40: 从那里可以得到这个表的拷贝? This article is a table of contents for the comp.lang.c frequently-asked questions (FAQ) list, listing the questions which the abridged and full versions of the FAQ list answer. (Both lists answer all questions; the wordings of the questions in this article are taken from the abridged list.) If you have only just come across this article, you will naturally be wondering where the lists which it indexes can be found. The unabridged version is normally posted to comp.lang.c on the first of each month, and the abridged version twice per month, both with Expires: lines which should keep them around all month. They can also be found in the newsgroups comp.answers and news.answers . They are available for anonymous ftp from ftp.eskimo.com in directoru u/s/scs/C-faq/. Several sites archive news.answers postings and other FAQ lists, including comp.lang.c's: two sites are rtfm.mit.edu (directories pub/usenet/news.answers/C-faq/ and pub/usenet/comp.lang.c/ ) and ftp.uu.net (directory usenet/news.answers/C-faq/ ). A web version is at http://www.eskimo.com/~scs/C-faq/top.html . See the meta-FAQ list in news.answers for more information. Steve Summit scs@eskimo.com This article is Copyright 1990-1999 by Steve Summit. 由裘宗燕翻译。 Content from the book _C Programming FAQs: Frequently Asked Questions_ is made available here by permission of the author and the publisher as a service to the community. It is intended to complement the use of the published text and is protected by international copyright laws. The content is made available here and may be accessed freely for personal use but may not be republished without permission.