§ Загрузка файла в память

На вход подается строка с указанием, где файл находится, на выходе получается либо указатель на массив байтов, либо NULL, если файл не прочтён. Недостатки - невозможность напрямую узнать размер строки.
uint8_t* loadfile(const char* filename) {

    int rc, n = 0;

    FILE* fp = fopen(filename, "rb");
    if (fp == NULL) return NULL;

    // Определить размер файла
    fseek(fp, 0, SEEK_END);
    int fsize = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    // Выделить память
    uint8_t* memptr = (uint8_t*) malloc(fsize);

    // Загрузка чанками
    while ((rc = fread(mm + n, 1, 4096, fp))) n += rc;

    return memptr;
}