C Free 程序调试方法.docx

上传人:b****6 文档编号:6255619 上传时间:2023-01-04 格式:DOCX 页数:18 大小:4.98MB
下载 相关 举报
C Free 程序调试方法.docx_第1页
第1页 / 共18页
C Free 程序调试方法.docx_第2页
第2页 / 共18页
C Free 程序调试方法.docx_第3页
第3页 / 共18页
C Free 程序调试方法.docx_第4页
第4页 / 共18页
C Free 程序调试方法.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

C Free 程序调试方法.docx

《C Free 程序调试方法.docx》由会员分享,可在线阅读,更多相关《C Free 程序调试方法.docx(18页珍藏版)》请在冰豆网上搜索。

C Free 程序调试方法.docx

CFree程序调试方法

CFree5.0程序的单步调试

创建一份新的代码文件

可直接点击“文件”下的白色图标,或点击“文件”选择“新建”,或按快捷键“Ctrl+N”

(CFree5.0默认情况下新建的代码文件为.cpp格式,可在“工具”、“环境选项”、“新建文件类型”中更改,C语言标准格式为.c格式)

基于实例的C程序调试介绍

一、查看变量的内容

#include

intmain(intargc,char*argv[])

{

inti;

intsum;

sum=0;

for(i=1;i<=10;i++)

sum=sum+i;

printf("sum=%d",sum);

return0;

}

 

第一步,打开CFree5.0,输入上面的代码。

第二步,把光标移到“sum=0;”这一行,按F10

 

它的作用是设一个断点,程序运行到这里时,会停下来。

也就是说,接下来,程序必须通过按

F7键单步运行了。

第三步:

按F9(开始调试)

我们发现有一箭头停留在这句语句上,它指示程序停留的位置,而箭头所在的语句(“sum=0;”)还没有执行。

事实上,我们可以通过看一下内存变量sum的内容来验证。

方法是这样的:

 

打开“调试”下的“监视”,或者按快捷键“Alt+3”。

 

在“监视”的空白处点击鼠标右键,选择“添加监视”。

输入需要监视的变量名,这里输入为sum

这时我们可以在监视窗口中看到sum的内容不为0,而是一个随机的值。

 

第四步,我们按一下F7(进入),我们发现sum的内容变为0了。

这说明“sum=0;”这句语句被执行了。

我们还可以用同样的方法看一下i的内容。

只需要鼠标点

 

第六步,一步一步地按F7,我们可以发现在单步执行for循环语句的时候i和sum的内容在不断变化。

当退出循环时,我们发现i的内容为11(因为变量i的内容为11,i<=10这个条件不满足,所以程序退出循环)。

附带提一下,当程序已经执行了“sum=0;”这一句语句后,如果我们直接把光标移到“printf("sum=%d",sum);”,然后按Ctrl+F8,我们可以直接把上面的for循环都执行了,而不必一步一步地按F7。

在实践中,为了查找程序的逻辑错误,我们往往要单步运行该程序好几遍。

如果已经通过单步调试验证某一段语句(如一个for循环语句或者几个用户定义的函数)正确了,我们就可以用Ctrl+F8跳过这段语句,直接运行到还未测试的语句。

 

二、F7(进入)和F8(跳过)的区别

#include

intadd(intm,intn)

{

ints;

s=m+n;

returns;

}

intmain(intargc,char*argv[])

{

inti=1;

intj=2;

intsum;

sum=add(i,j);

printf("sum=%d",sum);

return0;

}

第一步,把光标移到“sum=add(i,j);”,按F10设置断点后按F9开始调试,此时“sum=add(i,j);”这句语句还没有执行。

 

接下来,如果按F7,则程序单步执行到intadd(intm,intn)的函数体,此时箭头停留的位置

如下图所示。

 

如果按不按F7而按F8,则把intadd(intm,intn)内的语句全部执行了(也就是说程序不会单步运行到add函数的里面)

此时箭头停留的位置如下图所示。

也就是说,碰到函数,F7会单步执行函数体的每一句语句,而F8则把函数当作一句普通的C语言语句来执行。

在调试程序的时候,我们可以这样做:

如果我们已经通过测试发现某一个函数已经正确,那么我们不必单步执行函数体的每一句语句;否则,我们单步执行函数体的每一句语句,监视相关的变量的内容,通过测试用例检查一下问题出在那里。

三、关于一重指针

我们知道,一个指针是一个变量的地址,是一个常量。

存放一个变量的地址的变量是指针变量。

例如:

“inta=1;intm;int*p;p=&a;”说明p是一个指针变量,它的内容为整型变量a的地址。

*p就是p所指向的变量a。

指针变量p指向整型变量a的实质是p存放的是a的地址。

注意:

(1)指针和指针变量是两个不同的概念。

(2)在int*p;这里*表示p是一个指针变量;m=*p;这里*和p结合起来,作为一个整体*p,表示p所指向的变量。

也就是说,这两个*的作用是不一样的。

下面我们通过例子来说明这个问题。

#include

#include

intmain(intargc,char*argv[])

{

inti=1;

int*p=NULL;

inttemp;

p=&i;

temp=*p;

printf("temp=%d,i=%d",temp,i);

return0;

}

为了程序的可靠性,往往要对指针变量赋初值NULL。

第一步,将光标移动到p=&i;按F10设置断点后按F9开始调试

在“监视”窗口中添加i,p,*p,temp。

第二步,将光标移到“printf("temp=%d,i=%d",temp,i);”,按Ctrl+F8。

这时我们可以在“监视”窗口中发现i的内容为1,*p的内容为1,p的内容为0x28ff44(注意每次调试时,地址可能不一样,因为编译器为变量分配的地址会变的),temp的内容为1。

*p的内容和temp的内容是一样的。

 

说明:

这里0x28ff44是i的地址,另外,系统每次分配给程序的数据段往往不一样,我们在调试程序时,在“监视”窗口中观察到的指针变量p的内容往往不是0x28ff44,这是正常的。

下面两个小节涉及到具体地址的例子也一样。

四、指针作为函数的参数

#include

#include

voidswap(int*p,int*q)

{

inttemp;

temp=*p;

*p=*q;

*q=temp;

}

intmain(intargc,char*argv[])

{

inti=1;

intj=2;

int*address_i=NULL;

int*address_j=NULL;

address_i=&i;

address_j=&j;

swap(&i,&j);

printf("i=%d,j=%d",i,j);

printf("%d%d",*address_i,*address_j);

return0;

}

函数swap的作用是交换两个内存变量的值。

第一步,将光标移动到address_i=&i;按F10设置断点后按F9开始调试

在“监视”窗口中添加i,j,address_i,,p,q,*p,*q,temp。

第二步,将光标移到swap(&i,&j);按Ctrl+F8。

这时我们可以发现address_i的内容为0x28ff44(对应&i),address_j的内容为0x28ff40(对应&j)。

第三步,按F7,进入到函数swap的函数体,这时我们发现“监视”窗口中p的内容为0x28ff44(对应&i

),q的内容为0x28ff40(对应&j)。

此时,“监视”窗口中address_i,address_j,i,j都出现了“未知”这样的信息,这是因为当前程序执行到了函数swap的函数体,而“监视”窗口中显示的内容为当前正在执行的函数里的变量和表达式。

为此,我们通过观察*p的内容来观察i的内容,通过观察*q的内容来观察j

的内容。

(这里涉及到了形参和实参的对应关系,p对应&i,q对应&j)

第四步按F7执行temp=*p;此时,temp的内容1,如下图所示。

这里指针变量p放了整型变量i的地址,所以p指向i,所谓的指向其实就是一个变量放了另一个变量的地址。

 

第五步,按F7执行*p=*q;

第六步,按F7执行*q=temp;

这样变量i和变量j的内容交换了。

说明:

由于读者执行程序时,得到的相关变量的地址值往往和这个例子中的地址值不一样,建议读者也按照本文的方法,画一画上面的图,能加深对指针的理解。

不管地址怎么变,p的内容和address_i的内容一样,q

的内容和address_j的内容一样。

 

分享到

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1