Какая разница, где используется fopen?

Мне бы не помешала помощь в понимании чего-то, что меня озадачило. Это касается положения fopen() для чтения файла.

Следующий код (C, скомпилированный с gcc 4.5.2):

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

void try_fopen(FILE* f_handle, const char* f_name, const char* mode) {
    f_handle = fopen(f_name, mode);
    if( f_handle == NULL ) {
        fprintf(stderr, "Error: Unable to open '%s'.", f_name);
        exit(EXIT_FAILURE);
    }
}

int cnt_ones(FILE* pFile) {
    int c;
    int n = 0;

    do {
      c = fgetc (pFile);
      if (c == '1') n++;
    } while (c != EOF);

    return n;
}

Почему размещение fopen в функции приводит к Segfault:

int main (int argc, char** argv) {
    FILE * pFile;
    try_fopen(pFile, argv[1], "r"); // Gives a Segfault

    printf ("The file contains %d ones.\n", cnt_ones(pFile) );
    fclose (pFile);

    return 0;
}

При помещении его в main (вместе с if нет) :

int main (int argc, char** argv) {
    FILE * pFile;
    pFile = fopen(argv[1], "r"); // While this doesn't give a Segfault
    if( pFile == NULL ) {
        fprintf(stderr, "Error: Unable to open '%s'.", argv[1]);
        exit(EXIT_FAILURE);
    }

    printf ("The file contains %d sign characters.\n", cnt_ones(pFile) );
    fclose (pFile);

    return 0;
}
0
задан con-f-use 14 May 2012 в 08:52
поделиться