我从教科书中找到了一个问题,让我们来自Yeshavant Kanethkar。问题是你必须在以下程序中找到错误:
#include<stdio.h>
void openfile(char *, FILE **);
int main()
{
FILE *fp;
openfile( "Myfile",fp);
if(fp==NULL)
printf("Unable to open file...\n");
return 0;
}
void openfile(char *fn, FILE **f)
{
*f=fopen(fn,"r");
}
答案是“没有错误”,但我不相信,因为在调用文件打开函数时我们应该通过引用调用它:
openfile("Myfile",&fp);
无误地使用此程序。
我的理解是正确的,还是正确的教科书?
答案 0 :(得分:2)
表达
openfile("Myfile", &fp);
而不是
openfile("Myfile", fp);
使程序完成。
openfile("Myfile", fp)
的问题在于指针类型:如果声明FILE *fp;
从FILE **
获取类型fp
,则需要指针地址和一元&
可以帮忙。
编译器可以在没有错误消息的情况下进行编译,因为FILE *
和FILE **
都是指针并且隐式转换有效,但通常会针对此类情况显示警告。
我的Visual Studio警告如下:
警告1警告C4047:&#39;功能&#39; :&#39; FILE **&#39;不同的间接水平来自&#39; FILE *&#39; c:\ users \ user \ documents \ visual studio 2013 \ projects \ consoleapp \ source.c 10
<强>更新强>
尝试以下更新程序:
#include<stdio.h>
void openfile(char *, FILE **);
int main()
{
FILE *fp = NULL;
printf("Before:\n");
printf("value of fp = %p\n", fp);
printf("address of fp = %p\n", &fp);
openfile("Myfile", &fp);
printf("After:\n");
printf("value of fp = %p\n", fp);
printf("address of fp = %p\n", &fp);
if (fp == NULL)
printf("Unable to open file...\n");
return 0;
}
void openfile(char *fn, FILE **f)
{
printf("Inside (before):\n");
printf("value of f = %p\n", f);
printf("value of *f = %p\n", *f);
*f = fopen(fn, "r");
printf("Inside (after):\n");
printf("value of f = %p\n", f);
printf("value of *f = %p\n", *f);
}
如果您的程序可以打开文件,您会看到类似
的内容Before:
value of fp = 00000000
address of fp = 0019F9B0
Inside (before):
value of f = 0019F9B0
value of *f = 00000000
Inside (after):
value of f = 0019F9B0
value of *f = 580E7350
After:
value of fp = 580E7350
address of fp = 0019F9B0
这里我们看到地址,并且在调用openfile
之后更改了fp
的值