2017-01-05 6 views
-2

Началось программирование несколько месяцев назад, поэтому мой вопрос может заставить вас чувствовать себя плохо (извините).Передача указателя файла на функцию

Позволяет сказать, что я хотел напечатать что-нибудь в мой файл test.txt из функции, как это:

главная:

int main() 
{ 
    FILE *fp; 
    test(fp); 
    ... 
} 

функция:

void test(FILE *fp) 
{ 
    fp = fopen("test.txt","w"); // it crashed here 
    ... 
} 

Debugging в VS говорит: " Переменная «fp» используется без инициализации ».

Тогда я решил изменить первую строку моей главной функции:

FILE *fp = NULL; 

И вдруг все работает отлично.

Может кто-нибудь, пожалуйста, объясните мне это поведение?

+2

Это неопределенное поведение читать неинициализированное значение (которое является то, что вы делаете, когда вы вычислите выражение 'тест (FP)'). –

+0

Код также не имеет смысла, еще раз демонстрируя, что неопределенное поведение является * симптомом *, а не проблемой. –

+0

проблема заключается в том, что при возврате теста переменная fp не сохраняет значение, назначенное ей вызовом fopen. Итак, если вы используете его позже в основном, у вас будет проблема – bruceg

ответ

3

Ваш вопрос на самом деле не имеет ничего общего с указателями файлов - это программа даст вам такое же предупреждение с помощью int:

void test(int i) 
{ 
    i = 5; 
    ... 
} 

int main() 
{ 
    int i; 
    test(i); 
    ... 
} 

предупреждение потому, что вы прошли неинициализированный переменную в функцию. Неинициализированные переменные могут содержать любое значение (или может сбой программы при доступе, но на практике это никогда не произойдет).

Таким образом, предупреждение говорит вам: «Эй, почему вы передаете значение, в котором вы даже не знаете, что такое ценность?»

Но это не имеет значения, потому что ваша test функция затем переходит игнорировать значение, которое было передано в.

Смежные вопросы