0.写在最前面,C语言不是脚本语言,所以你要明白,如果你的程序出现了什么奇奇怪怪的错误,那么多半是因为某个地方的语法不对。并且这样的错误可能调试都调试不出来,只能靠个人体悟去发现。
C语言作为一门程序语言很精确,但是如果你写的是错误的语句,那你就会得到模糊的结果。为了可以精确,我们必须让自己的思维适应计算思维。
1.数组越界
2.循环变量在循环内部复制
比如 :
for(i=5;i<=N;i++)
{
int count=0;//作为累加器&初始化;
for(i=0;i<=N;i++)
a[i]=0;
}
在这个错误程序里面,循环只执行一次后,i=N+1;
3.堆排序的第一个是最大(最小)值,但是最后一个不是最小(最大)值;
4.DEV C++调试的时候,如果你从第一个for循环开始,查看变量的时候一开始就有j=2,这是正常的,不是你的问题。
但是如果此时对应的参数值很怪的话,那就有可能是逻辑问题,是你出错了。
for(j=1;j<=i-1;j++)
for(k=j+1;k<=i-1;k++)
如果编译通过但是得不到想要的结果,或者调试的时候变量的值很怪,不妨来看看这篇文章,也许就能发现问题,节省时间
5.for循环for(参数一;终止条件;操作) 操作;一旦遇到终止条件,循环就会终止,请不要想当然的以为,循环会跳过某些终止条件继续进行。
6.调试到某一步的时候,不该改变的值改变了。
for(y=0;y<=N;y++)
{
(fzu+y)->data=(fzu+y)->flag1=(fzu+y)->left=(fzu+y)->leftTail=(fzu+y)->length=(fzu+y)->right=(fzu+y)->rightTail=0;
}//fzu初始化
比如我碰到的这个例子,上述代码是某个函数中的一段,但每次运行到这里,都会把某个int型变量i的值变成一个随机数,解决的方法是,在函数内部新定义一个静态变量j,令j=i,程序中用到i的地方全部换成j就好。
7.如果你是用C语言写的代码,那么保存的时候记得保存成C代码,而不要是C++代码。
8.调试的时候,函数运行到某一步直接跳到最后时,可能有两个原因:1.括号不匹配;2.有其他语法错误。即使是warning,也要重视,改到0 error 0 warning 再运行。warning的地方恰恰是与你预期不同的关键之处。有一次我出现了这样的错误,原因是因为函数的返回值是指针,但是在主程序中我一直把这个返回值当作数组用。一种可行的解决方法是,把数组定义在结构里,让函数的返回值是结构就好。
9.为什么函数里面的赋值语句不被运行?函数中参数运行到某一步后,即使没有赋值语句,值也会改变? 解决方法:把这些变量的类型改为静态变量即可。
10.函数里面的静态变量一定要重视。
11.调试过程中,可能会出现某种情况:虽然查看变量的值明显不对,但是在调试过程中,确是按照实际正确的值运行的。