-
xzsdn_08



- 注册时间 01-04-2009
- 江苏徐州
- 发帖总数 641
|
- 17.1 遇到不可理解的不合理语法错误, 似乎大段的程序没有编译。
- 17.2 为什么过程调用不工作?编译器似乎直接跳过去了。
- 17.3 程序在执行用之前就崩溃了, 用调试器单步跟进, 在 main() 之前就死了。
- 17.4 程序执行正确, 但退出时崩溃在 main() 最后一个语句之后。为什么会这样?
- 17.5 程序在一台机器上执行完美, 但在另一台上却得到怪异的结果。更奇怪的是, 增加或去除调试的打印语句, 就改变了症状……
- 17.6 为什么代码: char *p = "hello, worl!"; p[0] = 'H'; 会崩溃?
- 17.7 ``Segmentation violation", ``Bus error" 和 ``General protection fault" 意味着什么?
17. 1 遇到不可理解的不合理语法错误, 似乎大段的程序没有编译。 检查是否有没有结束的注释, 不匹配的 #if/#ifdef/#ifndef/#else/#endif 指令, 又或者没有完成的引号。记得还要检查头文件。参见问题 2.14, 10.8 和 11.28。
17. 2 为什么过程调用不工作?编译器似乎直接跳过去了。 代码是否看起来象这样:
myprocedure; /* 我的过程 */
C 只有函数, 而函数调用总要用圆括号将参数括起来, 即使是无参数的函数。用下列代码:
myprocedure();
17. 3 程序在执行用之前就崩溃了, 用调试器单步跟进, 在 main() 之前就死了。 也许你定义了一个或多个非常大的局部数组 (超过上千字节)。许多系统只有固定大小的堆栈, 即使那些自动动态堆栈分配的系统也会因为一次性要分配大段堆栈而失败。
一般对大规模数组, 定义为静态的数组会更好。如果由于递归的原因, 每次都需要一组新的数组, 可以用 malloc() 动态申请内存, 参见问题 1.11。
参见问题 11.12, 16.4, 16.5 和 18.4。
17. 4 程序执行正确, 但退出时崩溃在 main() 最后一个语句之后。为什么会这样? 注意是否错误说明了 main(), 参见问题 2.14, 10.8, 11.12 和 11.14。是否把局部缓冲传给了 setbuf() 或 setvbuf()。又或者问题出在注册于 atexit() 的清理函数。参见问题 7.6 和 11.17。
参考资料: [CT&P, Sec. 5.3 pp. 72-3]。
17. 5 程序在一台机器上执行完美, 但在另一台上却得到怪异的结果。更奇怪的是, 增加或去除调试的打印语句, 就改变了症状…… 许多地方有可能出错。下面是一些通常的检查要点:
- 未初始化的局部变量, 参见问题 7.1。
- 整数上溢, 特别是在一些 16 比特的机器上, 一些中间计算结果可能上溢, 象 a * b / c, 参见问题 3.11。
- 未定义的求值顺序, 参见问题 3.1 到 3.5。
- 忽略了外部函数的说明, 特别是返回值不是 int 的函数, 或是参数 ``缩小" 或可变的函数。参见问题 1.8, 11.4 和 15.1。
- 复引用空指针, 参见第 5 章。
- malloc/free 的不适当使用: 假设 malloc 的内存都被清零、已释放的内存还可用、再次释放已释放内存、malloc 的内部被破坏, 参见问题 7.16 和 7.17。
- 指针类常规问题, 参见问题 16.7。
- printf() 格式与参数不符, 特别是用 %d 输出 long int, 参见问题 12.7。
- 试图分配的内存大小超出一个 unsigned int 类型的范围, 特别是在内存有限的机器上, 参见问题 7.14和 19.27。
- 数组边界问题, 特别是暂时的小缓冲, 也许用于 sprinf() 来构造一个字符串, 参见问题 7.1 和 12.19。
- 错误的假设了 typedef 的映射类型, 特别是 size_t。
- 浮点问题, 参见问题 14.1 和 14.4。
- 任何你自己认为聪明的在特定机器上的机器代码生成小技巧。
正确使用函数原型说明能够捕捉到一些以上的问题。lint 会捕捉到更多。参见问题 16.3, 16.4 和 18.4。
17. 6 为什么代码: char *p = "hello, worl!"; p[0] = 'H'; 会崩溃? 字符串实字并不总是可以修改的, 除非是用在字符数组的初试化。试用:
char a[] = "hello, world!";
参见问题 1.13。
参考资料: [ISO, Sec. 6.1.4]; [H&S, Sec. 2.7.4 pp. 31-2]。
17. 7 ``Segmentation violation", ``Bus error" 和 ``General protection fault" 意味着什么? 通常, 这意味着你的程序试图访问不该访问的内存地址, 一般是由于堆栈出错或是不正确的使用指针。可能的原因有: 局部数组溢出 (用堆栈分配的自动变量); 不小心, 用了空指针 (参见问题 5.2 和 5.15)、未初始化指针、地址未对齐的指针或其它没有适当分配的指针 (参见问题 7.1 和 7.2); malloc 内部被破坏 (参见问题 7.16); 函数调用参数不匹配, 特别是如果用了指针, 两个可能出错的函数是 scanf() (参见问题 12.11) 和 fprintf() (确定他的第一个参数是 FILE *)。
参见问题 16.3 和 16.4。
|
|