получить c и Fget c не работает ... давая сбой сегментации - PullRequest
0 голосов
/ 04 апреля 2020

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

Я включил ...

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

и мой код ...

void decodeBin(char * filename){
    //opens  filename for reading and outfilename for writing
    FILE * input = fopen(filename, "r");

    char file_name[] = "";
    strcpy(file_name, filename);
    char out_file[] = "out";
    strcat(out_file, file_name);
    FILE * output = fopen(out_file, "w");


    char ch;
    if (input != NULL){
        while((ch = fgetc(input)) != EOF)
        printf("%c", ch);
    }

    fclose(input);
    fclose(output);
}

Я просмотрел другие сообщения о переполнении стека, в которых предлагалось проверить, если указатель файла не нулевой, что я и делаю. Что не так?

1 Ответ

3 голосов
/ 04 апреля 2020

Вы вызываете неопределенное поведение, записывая за пределы массивов file_name и out_file. Когда вы не указываете размер для массива, размер определяется из строки, которую вы используете для его инициализации. Таким образом, это эквивалентно

char file_name[1] = "";
char out_file[4] = "out";

Дополнительный байт для конечного нуля.

Поскольку вы не объявили массивы достаточно большие для строк, в которые вы копируете, вы получите неопределенное поведение.

Вам необходимо объявить размер массивов, достаточно большой, чтобы вместить максимально возможное имя файла. Или используйте malloc() для определения размера в терминах параметров.

Переменная file_name не требуется, поскольку это просто копия filename, и вы можете использовать ее напрямую.

char *outfile = malloc(strlen(filename) + sizeof("out"));
sprintf(outfile, "out%s", filename);

Затем в конце функции выполните

free(outfile);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...