Есть ли способ прочитать текстовый файл и сохранить его в динамическом массиве символов в C, попробуйте его и получите «malloc (): повреждение памяти» - PullRequest
0 голосов
/ 06 февраля 2019

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

У меня уже есть код для чтения файла и сохранения его в char *sending_data.Если я пытаюсь скопировать содержимое в другое char *, я получаю malloc(): memory corruption error.

И если я пытаюсь напечатать размер sending_data или data, я получаю Memory access error.

char * readFile(char *path) {
    FILE *fp;
    char *data = NULL;

    if ((fp = fopen(path, "rb")) == NULL) {
        printf("Fehler!! / Datei konnte nicht gelesen werrden \n\n");
        return data;
    } else if (fseek(fp, 0, SEEK_END) != 0) {
        fclose(fp);
    } else {
        long size = ftell(fp);
        if (size > 0 && (data = (char *) malloc(size + 1)) != NULL) {
            fseek(fp, 0, SEEK_SET);
            if (fread(data, 1, size, fp) != (size_t) size) {
                free(data);
                data = NULL;
            } else {
                data[size] = '\0';
            }
        }
        fclose(fp);
    }

    return data;
}

int main(int argc, char *argv[]) {
    /*uint8_t */unsigned char *data;

    int USER_SIZE = 8; // you can also use a macro

    unsigned char *data;


    char *sending_data;
    sending_data =(char*)malloc ( USER_SIZE* sizeof (char));

    sending_data =readFile("../PayloadFiles/ToDo.txt");

    printf(sending_data);
    printf(strlen(sending_data));

    data = (char*)malloc( USER_SIZE * sizeof(char));

    if(data)
        strcpy((char*)data, sending_data);

    printf(data_size);
    printf(data); 
}

Я ожидаю содержимое и размер файла, фактически скопированное содержимое файла в другом char *

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы должны выделить достаточно места в переменной data.

data = (char*)malloc(strlen(sending_data)+1);

Также неплохо проверить, что sending_data не равен нулю после вызова readFile.

Вы, вероятно, должны удалить вызов sending_data = (char*)malloc(USER...) в своей основной функции перед вызовом readFile, так как это приведет к утечке памяти (вы выделяете память внутри readFile и перезаписываете sending_data его значением результата).

Кроме того, было бы здорово вызвать free для выделенной памяти в конце, если основная функция (так как рекомендуется освободить то, что вы выделили)

0 голосов
/ 06 февраля 2019

Вы неправильно используете printf.

printf(sending_data);
printf(strlen(sending_data));
...
printf(data_size);
printf(data); 

Первый параметр printf - это строка формата, содержащая текст, а также спецификаторы формата, указывающие, как печатать дополнительные аргументы.Вы можете избежать этого с помощью sending_data и data, если в них нет встроенных спецификаторов формата, но у вас есть несоответствие типов при передаче strlen(sending_data) и data_size.Это вызывает неопределенное поведение , что в данном случае приводит к сбою.

Используйте строку формата для указания способа печати аргументов:

char *sending_data;
// no need to malloc since you already did that in readFile
sending_data =readFile("../PayloadFiles/ToDo.txt");

printf("%s\n", sending_data);
printf("%zu\n", strlen(sending_data));

int data_size = strlen(sending_data));
data = malloc( data_size + 1);

if(data)
    strcpy((char*)data, sending_data);

printf("%d\n", data_size);
printf("%s\n", data); 
...