После хранения данных в куче, как я могу сохранить их в структуре без переполнения стека? - PullRequest
0 голосов
/ 18 мая 2018

Я читаю все содержимое файла в массив символов успешно.Затем я хочу сохранить эти данные в структуре.

Я уверен, что инициализация массива в структуре до миллиона неверна, но файл велик, и ему требуется от 500 КБ до 1 м байт.

struct ArrayStoredInHeap
{
    char entireFile[1000000];   
};

Сохранение файла в массив char ниже работает, если я использую файл меньшего размера и изменяю вышеупомянутый массив struct char на гораздо меньший размер контейнера.

char *GetFileContent(char *filePath)
{
    char *buffer = NULL;
    size_t size = 0;

    FILE *file = fopen(filePath, "r");

    fseek(file, 0, SEEK_END);
    size = ftell(file);

    rewind(file);

    buffer = malloc((size + 1) * sizeof(*buffer));

    fread(buffer, size, 1, file);

    buffer[size] = '\0';

    return buffer;

}

Проблема, кроме явно неправильной инициализации массива структуры, заключается в том, что всякий раз, когда я использую файл большего размера, я получаю исключение переполнения стека при инициализации myStruct

int main (void)
{
    char *file = {"file1.txt", "file2.txt", "file3.txt"};
    int numberOfFiles = strlen(file);

    struct ArrayStoredInHeap myStruct[numberOfFiles];

    for(int i = 0; i < numberOfFiles; i++)
    {
        struct ArrayStoredInHeap tmpStruct;

        strcpy(tmpStruct.entireFile, GetFileContent(&file[i]));

        myStruct[i] = tmpStruct;
    }
    for(int i = 0; i < numberOfFiles; i++)
    {
        printf("%s \n", myStruct[i].entireFile);        
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Если вы должны использовать автоматические переменные хранения - увеличьте размер стека.

например, таким образом:

int SeStack(rlim_t size)
{
    struct rlimit rlim;
    if(!getrlimit(RLIMIT_STACK, &rlim))
    {
        if (rlim.rlim_cur <= size)
        {
            rlim.rlim_cur = size;
            return setrlimit(RLIMIT_STACK, &rlum);
        }
        else
        {
            return 0;
        }
    }
    return EPERM;
}
0 голосов
/ 18 мая 2018

Вы все еще можете хранить данные в структуре, в то же время сохраняя их в куче.

Давайте посмотрим на следующую структуру

struct ArrayStoredInHeap{
    char * entireFile;
}

, затем вы можете сделать что-то следующим образом

int main(){
    char * fileName;
    // get file contents
    char * fileContent = GetFileContent(&fileName);
    struct ArrayStoredInHeap fileStruct;
    // allocate memory 
    fileStruct.entireFile = (char*)malloc(strlen(fileContent)+1); //Not sure if +1 is necessary
    // copy file contents to struct
    strcpy(fileStruct.entireFile, fileContent);
    free(fileContent)
    /* another solution could be assigning the pointer right into the struct as follows:

    fileStruct.entireFile = GetFileContent(&fileName);
    */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...