书很快就看完了 这几天去助教了 才发现广看书没有什么用 书上看的理论当时看是记住了 可是在用的时候 或者是出现问题的时候就还是不会, 哪天去洪福校区助教 帮本科生改程序就给了我一个教训,
#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。所以在主函数中要重新赋值,或者用指向指针的指针修改. 好好在看一遍书,多调有问题的程序才是王道呀!!
本文通过一个简单的C语言文件操作程序实例,详细分析了指针作为函数形参时可能遇到的问题,特别是指针修改带来的主函数指针不变的陷阱,并提出了相应的解决方法。

被折叠的 条评论
为什么被折叠?



