Expression
openfile("Myfile", &fp);
вместо
openfile("Myfile", fp);
делает программа завершена.
Проблема openfile("Myfile", fp)
в указательных типов: если декларация FILE *fp;
получить тип FILE **
от fp
вам нужен адрес указателя, и унарный &
может помочь.
Компилятор может составлять компиляцию без сообщения об ошибке, поскольку и FILE *
, и FILE **
являются указателями и неявным преобразованием, но обычно для таких случаев отображается предупреждение.
предупреждение My Visual Studio выглядит как:
Предупреждение 1 предупреждение C4047: 'функция': 'FILE **' отличается уровней косвенности от 'FILE *' C: \ Users \ Пользователь \ Documents \ Visual Studio 2013 \ Projects \ consoleapp \ source.c 10
UPDATE:
Попробуйте следующую обновленную программу:
#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
Здесь мы видим адреса, и что значение fp
было изменено после вызова OpenFile
Что компилятор говорит вам? –
'openfile (« Myfile », fp);' -> 'openfile (« Myfile », &fp);'. Ваш компилятор предупреждал вас. В предупреждениях C certains, как тот, который у вас есть, должны рассматриваться как ошибки. использовать? –
Подсказка: избавиться от этой книги ... – LPs