2015-01-31 3 views
0

У меня есть фиктивная функция обугленного * GetFileName(), который просто возвращает указатель на массив символов:C прочитать файл с указателем на строку в качестве имени

char * getFileName() { 
    char buff[11] = "index.html"; 
    char *p; 
    p = buff; 
    printf ("name of the file: %s\n", p); 
    return p; 
} 

В моем случае этот указатель имя является имя файла, я хочу, чтобы открыть и прочитать из основных:

int main() { 
    char *fp; 
    FILE *file; 
    fp = getFileName(); 
    int c; 
    file = fopen(fp, "r"); 
    if (file) { 
     while ((c = getc(file)) != EOF) { 
      putchar(c); 
     }  
     fclose(file); 
    } 
    return (0); 
} 

Однако, я не могу открыть этот файл, используя значение указателя в качестве имени, хотя, когда я печатаю ∥f∥p, я получаю правильное имя, если file: index.html. Любые предложения, что я мог бы потерять? Спасибо :)

ответ

0

Вы возвращаете указатель на локальную переменную - к моменту, когда getFileName() возвращает, buff уничтожен, а значение p указывает на память, которая больше не может быть использована.

Если вы действительно хотите сделать это, вы должны сделать buff в static переменное:

char *getFileName(void) { 
    static char buff[] = "index.html"; 
    char *p; 
    p = buff; 
    printf ("name of the file: %s\n", p); 
    return p; 
} 

static переменные не стек распределённые; они .. хорошо .. статически выделены.

Несколько других важных деталей:

  • Функция f, которая не принимает никаких аргументов должны быть объявлены как f(void).
  • В этом случае вам не нужно явно указывать размер buff, потому что вы инициализировали его "index.html".
Смежные вопросы