编译期低级错误集锦[C语言篇]


小熊总是在同样的坑里反复摔倒。

编译时犯的低级错误往往会浪费很多时间去查找资料,对比代码。仔细思考之后发现原来是如此简单的问题。然后就是对浪费了时间感到愧意和再次跌倒在同样的地方感到的懊悔。
我们常常说不要在同一个地方跌倒,但是人的记忆是有限的,我们时时都可能在同样的地方跌倒。
所以,为了快速定位曾经出现的坑位,我打算把自己犯过的错误列举出来。遇到问题时查一查,没有遇到问题时温一温。
错误不可避免,但是可以减少纠正错误而浪费的时间吧。
(列表将按照自己出现的错误的顺序更新,欢迎在Comment中提供新的错误和错误原因)

由于使用的编译器经常变化,错误提示信息仅供参考。
但是我自己的心得是,遇到一眼看不明白的编译错误时不要烦躁,错误提示信息都是斟字酌句提炼出来最能简明扼要表现最终错误的关键信息。
静下心来采用从下到上倒推的方法寻找错误应该会有不少帮助。

《编译错误列表》

错误:对结构体数组进行memset时报告“invalid struct or union type”。
原因:忘记了对结构体数组使用数组下表,直接在结构体数组后引用结构体成员。

错误:新建函数提示“type redeclaration of XXX”
原因:函数声明和函数定义不一致,检查函数返回类型,参数类型和参数个数。

追加:编译期顺利通过的代码在运行期发现问题往往更让人难以发现。所以,以下开始追加运行期错误列表。

《运行错误列表》

错误:一段内存缓冲在没有对其进行写入操作的期间被莫名篡改了内容。
原因:紧接着这段内存缓冲前有一个数组,在某次对数组的赋值中,错误使用了数组上限的定义值作为数组下标,导致改写了出现问题的内存缓冲的值。

Tagged on: ,

3 thoughts on “编译期低级错误集锦[C语言篇]

  1. wayne

    今天正好碰到一个warning,type mismatch in conditional expression
    出现在 aa ? bb : cc
    bb是typedef过的char,cc是char,查ISO C standard,要求?:的第二第三个操作数必须是同样类型,晕死。。。

  2. MrBear Post author

    @wayne: 结果怎么办?强制类型转换搞定了?

  3. Pingback: 不务正业得染指JavaScript - CodeCake

发表评论

电子邮件地址不会被公开。