перезаписать в динамически распределенный буфер более 8 байт - PullRequest
0 голосов
/ 13 января 2020

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

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

Когда я запускаю код, у меня возникает ошибка, и я не знаю, почему. Это ошибка, которую я получаю:

./main
File Size: 786447
make: *** [Makefile:22: run] Segmentation fault (core dumped)

Эта ошибка возникает в строке, содержащей fread, что заставляет меня думать, что она не выделяет достаточно памяти, но я проверил размер файла. Кажется, он должен быть достаточно большим.

Ниже приведен простой пример файла с ошибкой segfault.

Test. c

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

typedef unsigned char uchar;

int readFile(const char* filename) {
    FILE* fp;
    int sz;
    uchar* data;
    fp = fopen(filename, "r");
    if (fp != NULL) {
        fseek(fp, 0L, SEEK_END);
        sz = ftell(fp);
        printf("File Size: %d\n", sz);
        rewind(fp);
        data = (uchar*)malloc(sz);
        fread(&data, sizeof(uchar), sz, fp);
        //later do things with data

        fclose(fp);
        return 0;
    }
    return 1;
}

Я заметил одну действительно странную вещь. Я знаю, что sizeof(data) даст мне 8 на моей машине, потому что это размер указателя на 64-битной машине. Однако, если я читаю 8 или менее байтов в fread, это не вызывает ошибки.

По сути, в строке fread(&data, sizeof(uchar), sz, fp);, если sz >8 вызывает ошибки.

Сначала я подумал, что, возможно, проблема в том, что я читал слишком большой файл, но, конечно, вы можете читать больше 8 байтов за раз, верно?

...