常见错误与程序调试分析.ppt
文本预览下载声明
第十四章 主要内容 14.1 常见错误分析 14.2 程序调试 ① 在main函数中增加一个对max函数的声明,即函数的原型: main( ) {float max(float,float);/*声明将要用到的max函数为实型*/ float x,y,z; x=3.5;y=-7.6; z=max(x,y); printf(%f\n,z); } ② 将max函数的定义位置调到main函数之前。即: float max(float x,float y) {return(z=x>y?x:y);} main() {float x,y,z; x=3.5;y=-7.6; z=max(x,y); printf(%f\n,z); } 这样,编译时不会出错,程序运行结果是正确的。 (23) 误认为形参值的改变会影响实参的值。 main( ) {inta,b; a=3;b=4; swap(a,b); printf(%d,%d\n,a,b); } swap(int x,int y) {int t; t=x;x=y;y=t; } 原意是通过调用swap函数使a和b的值对换,然后在main函数中输出已对换了值的a和b。但是这样的程序是达不到目的的,因为x和y的值的变化是不传送回实参a和b的,main函数中的a和b的值并未改变。 如果想从函数得到一个以上的变化了的值,应该用指针变量。用指针变量作函数参数,使指针变量所指向的变量的值发生变化。此时变量的值改变了,主调函数中可以利用这些已改变的值。如: main( ) {int a,b,*p1,*p2; a=3;b=4; p1=a;p2=b; swap(p1,p2); printf(%d,%d\n,a,b); /a和b的值已对换/ } swap(int *pt1, int *pt2) {int t; t=*pt1;*pt1=*pt2;*pt2=t; } (24) 函数的实参和形参类型不一致。 main( ) {int a=3,b=4; c=fun(a,b); … } fun(float x,float y) { … } 实参a、b为整型,形参x、y为实型。a和b的值传递给x和y时,x和y的值并非3和4。C要求实参与形参的类型一致。如果在main函数中对fun作原型 声明: fun (float, float); 程序可以正常运行,此时,按不同类型间的赋值的规则处理,在虚实结合后x=3.0, y=4.0。也可以将fun函数的位置调到main函数之前,也可获正确结果。 (25) 不同类型的指针混用。 main( ) {int i=3,*p1; float a=1.5,*p2; p1=i; p2=a; p2=p1; printf(%d,%d\n,*p1,*p2); } 企图使p2也指向i,但p2是指向实型变量的指针,不能指向整型变量。指向不同类型的指针间的赋值必须进行强制类型转换。如: p2=(float*)p1; 这种情况在C程序中是常见的。例如,用malloc函数开辟内存单元,函数返回的是指向被分配内存空间的void *类型的指针。而人们希望开辟的是 存放一个结构体变量值的存储单元,要求得到指向该结构体变量的指针,可以进行如下的类型转换。 struct student {int num; char name[20]; float score; }; struct student student1,*p; … p=(struct student *)malloc(LEN); p是指向struct student结构体类型数据的指针,将malloc函数返回的void *类型指针转换成指向struct student类型变量的指针。 (26) 没有注意函数参数的求值顺序。例如有以下语句: i=3; printf(%d,%d,%d\n,i,++i,++i); 许多人认为输出必然是 3,4,5 实际不尽然。在Turbo C和其他一些C系统中输出是 5,5,4 因为这些系统是采取自右至左的顺序求函数参数的值。先求出最右面一个参数(++i)的值为4,再求出第2个参数(++i)的值为5,最后求出最左面的参数(i)的值5。 C标准没有具体规定函数参数求值的顺序是自左而右还是自右而左。但每个C编
显示全部