高质量c编程指南 之二

书很快就看完了 这几天去助教了 才发现广看书没有什么用 书上看的理论当时看是记住了 可是在用的时候 或者是出现问题的时候就还是不会, 哪天去洪福校区助教 帮本科生改程序就给了我一个教训,

#include < stdio.h >
struct  hardWare {
       
int num1;
       
char name[30];
       
int  num2;
       
float price;
}
;

int  enterChoice( void ); // 选择要对清单进行的操作 //
void  buildFile(FILE * ); // hard.dat不存在时新建一个 //  
void  textFile(FILE  * ); // 可打印txt文件 //  
void  updateFile(FILE  * ); // 更新清单已有某项 //  
void  newRecord(FILE  * ); // 向清单添加新的项 //  
void  deleteRecord(FILE  * ); // 消除清单已有某项 //  

main()
{
      FILE 
* cfPtr;
      
int choice;
      
//没有打开文件需要新建// 
      if((cfPtr=fopen("d:/hardWare.dat","r+"))==NULL){
           printf(
"File could not be opened.");                                                   
           buildFile(cfPtr);
           printf(
"what is the cfPtr");
      }

      
else{
           
while((choice=enterChoice())!=5){
                 
switch(choice){
                        
case 1:
                             textFile(cfPtr);
break;
                        
case 2:
                             updateFile(cfPtr);
break;
                        
case 3:
                             newRecord(cfPtr);
break;
                        
case 4:
                             deleteRecord(cfPtr);
break;
                 }
                      
           }
           
      }

      
      fclose(cfPtr);
//关闭文件// 
      return 0;
}


void  buildFile(FILE * cfPtr)
{
     
int i;
     
struct hardWare blank={0,"",0,0};
     
     cfPtr
=fopen("d:/hardWare.dat","w");
     
for(i=1;i<=100;i++)
        fwrite(
&blank,sizeof(struct hardWare),1,cfPtr);
       
// fclose(cfPtr);
       printf("what is cfPtr value");
      
}
       











 代码很简单是关于文件的 就是查找文件如果没有就新建一个,有的话就对其进行一系列的操作, 问题出来了 当地一次执行程序的时候,编译没有问题 但是当程序快执行完时 出现运行时刻错误,当时不知道为什么 加上那边用的开发环境实在是用不惯 debug时观察变量很不方便 就说回来看看  今天一看恍然大悟 所犯的问题就是 林锐博士在书中花大笔墨提到的 指针作为函数形参的问题, 在这个程序中毛病出在函数bulidfile中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _cfPtr,编译器使 _cfPtr = cfPtr。如果函数体内的程序修改了_cfPtr的内容,就导致参数cfPtr的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_cfPtr申请了新的内存,只是把_cfPtr所指的内存地址改变了,但是cfPtr丝毫未变。所以主函数cfPtr任为NULL。所以在主函数中要重新赋值,或者用指向指针的指针修改. 好好在看一遍书,多调有问题的程序才是王道呀!! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值