C语言中函数参数问题
如下代码中,向一个函数中传入一个FILE指针。为什么我传一个FILE的地址进去,和返回一个FILE型指针会出现不同的结果?
用返回的FILE指针,结果正常;用传址进去的,段错误。这是为什么,麻烦大家帮我解释一下谢谢!
- int main(void)
- {
- char *fname = "/usr/local/nilex/crc/conf.d/crc.conf";
- FILE *fp, file_p;
- char value[WORD_MAX];
- int ret;
- if((fp = init_conf(&file_p, fname)) == NULL)
- return -1;
- char tmp[512];
- fgets(tmp, sizeof(tmp), fp);
- printf("fp tmp: %s\n", tmp);
- fgets(tmp, sizeof(tmp), &file_p);
- printf("tmp: %s", tmp);
- ... ...
- return ret;
- }
- FILE *init_conf(FILE *fp, char *path)
- {
- if((fp = fopen(path, "rt")) == NULL)
- {
- printf("cannot open file %s\n", *path);
- return NULL;
- }
- return fp;
- }
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
在init_conf中fp是个局部变量,要是想修改fp指针的值要用FILE ××fp,建议用返回值。
if((fp = fopen(path, "rt")) == NULL)这句改为
if((*fp = fopen(path, "rt")) == NULL)应该就没问题
main() 中的 file_p 变量在函数init_conf 函数执行后没有改变
ls说的没错,自动局部变量被释放了,所以file_p还是指向的NULL,这里fopen打开之后将变量指针指向FILE结构体,这里的形参就是定义在函数里面的局部变量,而传递file_p的地址给它等于给它赋值,之后又fopen相当于再次赋值把之前存储的地址给覆盖了(file_p定义成为非指针型,应该是会初始化一个FILE的).
看来你对函数传参还是不是很理解啊,所有函数的传参实际上都是值的拷贝,所谓传入指针也是地址值的拷贝。你init_conf中的形参fp是函数中的局部变量,而外部的fp作为实参,是将外部fp的值拷贝给了形参fp,而你函数里是将形参fp重新赋值为新的地址,而实参根本没有改变,你可以将init_conf函数改成这样:
FILE *init_conf(FILE **fp, char *path)
{
if((*fp = fopen(path, "rt")) == NULL)
{
printf("cannot open file %s\n", *path);
return NULL;
}
return *fp;
}
你说的我应该是理解了。但是为什么形参定义为双重指针,会达到我所要的效果呢?还麻烦详细说下。
不甚感激!
按我修改后的函数,你使用init_conf 函数时应该init_conf(&fp, fname)这样使用,这时候形参fp存储的值为实参fp的地址,所以此时形参进行*fp操作实际上就是取实参fp,此时修改形参*fp就是修改实参fp的值。
简单点说,就像你要通过函数修改一个外部的普通数据类型的变量时,传递的是参数是该变量的地址,同样你要修改一个外部的指针变量时,你当然要传递改指针的地址了。
非常感谢各位!
{:3_186:}