C语言中函数参数问题

发布于 2022-10-15 08:02:12 字数 1677 浏览 23 评论 0

如下代码中,向一个函数中传入一个FILE指针。为什么我传一个FILE的地址进去,和返回一个FILE型指针会出现不同的结果?
用返回的FILE指针,结果正常;用传址进去的,段错误。这是为什么,麻烦大家帮我解释一下谢谢!

  1. int main(void)
  2. {
  3.         char *fname = "/usr/local/nilex/crc/conf.d/crc.conf";
  4.         FILE *fp, file_p;
  5.         char value[WORD_MAX];
  6.         int ret;
  7.         if((fp = init_conf(&file_p, fname)) == NULL)
  8.                 return -1;
  9.         char tmp[512];
  10.         fgets(tmp, sizeof(tmp), fp);
  11.         printf("fp tmp: %s\n", tmp);
  12.         fgets(tmp, sizeof(tmp), &file_p);
  13.         printf("tmp: %s", tmp);
  14.        
  15.         ... ...
  16.         return ret;
  17. }
  18. FILE *init_conf(FILE *fp, char *path)
  19. {
  20.         if((fp = fopen(path, "rt")) == NULL)
  21.         {
  22.                 printf("cannot open file %s\n", *path);
  23.                 return NULL;
  24.         }
  25.        
  26.         return fp;
  27. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

不必在意 2022-10-22 08:02:12

在init_conf中fp是个局部变量,要是想修改fp指针的值要用FILE ××fp,建议用返回值。

困倦 2022-10-22 08:02:12

if((fp = fopen(path, "rt")) == NULL)这句改为
if((*fp = fopen(path, "rt")) == NULL)应该就没问题

卷耳 2022-10-22 08:02:12

main() 中的 file_p 变量在函数init_conf 函数执行后没有改变

假面具 2022-10-22 08:02:12

ls说的没错,自动局部变量被释放了,所以file_p还是指向的NULL,这里fopen打开之后将变量指针指向FILE结构体,这里的形参就是定义在函数里面的局部变量,而传递file_p的地址给它等于给它赋值,之后又fopen相当于再次赋值把之前存储的地址给覆盖了(file_p定义成为非指针型,应该是会初始化一个FILE的).

策马西风 2022-10-22 08:02:12

看来你对函数传参还是不是很理解啊,所有函数的传参实际上都是值的拷贝,所谓传入指针也是地址值的拷贝。你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;
}

请爱~陌生人 2022-10-22 08:02:12

看来你对函数传参还是不是很理解啊,所有函数的传参实际上都是值的拷贝,所谓传入指针也是地址值的拷贝。你 ...
chenxg0076 发表于 2011-05-11 14:26

你说的我应该是理解了。但是为什么形参定义为双重指针,会达到我所要的效果呢?还麻烦详细说下。

不甚感激!

小清晰的声音 2022-10-22 08:02:12

按我修改后的函数,你使用init_conf 函数时应该init_conf(&fp, fname)这样使用,这时候形参fp存储的值为实参fp的地址,所以此时形参进行*fp操作实际上就是取实参fp,此时修改形参*fp就是修改实参fp的值。
    简单点说,就像你要通过函数修改一个外部的普通数据类型的变量时,传递的是参数是该变量的地址,同样你要修改一个外部的指针变量时,你当然要传递改指针的地址了。

热鲨 2022-10-22 08:02:12

非常感谢各位!

陈甜 2022-10-22 08:02:12

{:3_186:}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文