2016-07-21 1 views
0

Я ожидаю, что следующий код будет записывать номер 42 в двоичный файл, а затем читать и распечатывать точное значение. И он делает это, но затем он не выйдет, просто остановится, как ожидая ввода пользователя. Вот код, который делает то, что я объяснил:Программа зависает, если оба написаны и прочитаны из файла в том же самом исполнении

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char argv[]){ 

    char *filename = "test.db"; 
    int *my_int = calloc(1, sizeof(int)); 
    *my_int = 42; 

    // First we open file to write to it 
    FILE *file = fopen(filename, "w"); 
    fwrite(my_int, sizeof(int), 1, file); 
    fflush(file); 
    free(file); 

    // Then we want to read from it 
    *my_int = -1; 
    file = fopen(filename, "r"); 
    fread(my_int, sizeof(int), 1, file); 
    free(file); 

    printf("Read back %d\n", *my_int); 

    return 0; 
} 

Я знаю, что я могу просто открыть его с w+ флагом, но я просто любопытно выяснить, почему она просто глохнет ..

+4

'free (file);' - undefined behavior – melpomene

+0

Почему вы используете 'calloc' для выделения' my_int', когда вы тут же перезаписываете '' '' s, где он находится? Возможно, более эффективно использовать 'malloc()', если вы планируете инициализировать его самостоятельно, прежде чем вы его прочитаете. –

ответ

7

Вы не free указатель файла, вы fclose это. Вызов free() по файлу, открытому с fopen, является неопределенным поведением.

Я уверен, что если вы замените свои линии free(file) на fclose(file), ваша проблема будет решена.


Я также рекомендую вам не беспокоить выделения памяти для my_intcalloc с, если вы используете его только в пределах этой функции. Может быть, лучше разместить эту память в стеке, то есть int my_int вместо int* my_int = calloc(sizeof(int)). Последнее требует, чтобы вы позже набрали free() в программе, в то время как первый - нет.

+0

Я следил за вашими предложениями и пришел к этому [новому и без ошибок] (http://gist.github.com/multivac61/a8b77adf2f3284336b2f24f6dcd1a0e1). Спасибо за помощь. – multivac61

2

Используйте [ fclose ], чтобы закрыть файл.

fclose(file); 

Кроме того, ссылка говорит:

Все внутренние буферы, связанные с потоком являются диссоциирует от его и покраснел:

Так

fflush(file); 

может быть здесь можно избежать.

Используйте [ free ], чтобы освободить зарезервированную память для указателя. В вашем случае

free(my_int); 

имеет смысл, если размещено до return.

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