免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4535 | 回复: 10
打印 上一主题 下一主题

C语言中函数参数问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-03 15:55 |只看该作者 |倒序浏览
如下代码中,向一个函数中传入一个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. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-05-03 16:42 |只看该作者
在init_conf中fp是个局部变量,要是想修改fp指针的值要用FILE ××fp,建议用返回值。

论坛徽章:
0
3 [报告]
发表于 2011-05-04 15:44 |只看该作者
if((fp = fopen(path, "rt")) == NULL)这句改为
if((*fp = fopen(path, "rt")) == NULL)应该就没问题

论坛徽章:
0
4 [报告]
发表于 2011-05-05 14:07 |只看该作者
main() 中的 file_p 变量在函数init_conf 函数执行后没有改变

论坛徽章:
0
5 [报告]
发表于 2011-05-06 18:39 |只看该作者
ls说的没错,自动局部变量被释放了,所以file_p还是指向的NULL,这里fopen打开之后将变量指针指向FILE结构体,这里的形参就是定义在函数里面的局部变量,而传递file_p的地址给它等于给它赋值,之后又fopen相当于再次赋值把之前存储的地址给覆盖了(file_p定义成为非指针型,应该是会初始化一个FILE的).

论坛徽章:
0
6 [报告]
发表于 2011-05-11 14:26 |只看该作者
看来你对函数传参还是不是很理解啊,所有函数的传参实际上都是值的拷贝,所谓传入指针也是地址值的拷贝。你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;
}

论坛徽章:
0
7 [报告]
发表于 2011-05-12 16:14 |只看该作者
看来你对函数传参还是不是很理解啊,所有函数的传参实际上都是值的拷贝,所谓传入指针也是地址值的拷贝。你 ...
chenxg0076 发表于 2011-05-11 14:26


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

不甚感激!

论坛徽章:
0
8 [报告]
发表于 2011-05-12 16:52 |只看该作者
按我修改后的函数,你使用init_conf 函数时应该init_conf(&fp, fname)这样使用,这时候形参fp存储的值为实参fp的地址,所以此时形参进行*fp操作实际上就是取实参fp,此时修改形参*fp就是修改实参fp的值。
    简单点说,就像你要通过函数修改一个外部的普通数据类型的变量时,传递的是参数是该变量的地址,同样你要修改一个外部的指针变量时,你当然要传递改指针的地址了。

论坛徽章:
0
9 [报告]
发表于 2011-05-20 15:31 |只看该作者
非常感谢各位!

论坛徽章:
0
10 [报告]
发表于 2011-05-20 16:40 |只看该作者
{:3_186:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP