Ошибка сегментации при выделении большого массива в C - PullRequest
0 голосов
/ 19 апреля 2020

Я намерен выделить большой массив размером 1073741824 (эквивалентно 1 ГБ, например), а затем прочитать его случайным образом, но я получаю ошибку сегментации (дамп памяти) только для определения массива, как я проверил, что мне нравится:

unsigned int size = 1073741824;
short arr = malloc(size * sizeof(short));

я также попытался разыграть его следующим образом, но все еще та же проблема:

unsigned int size = 1073741824;
short *arr = (short*) malloc(size * sizeof(short));

также команда ulimit возвращает unlimited

, так что я делать неправильно?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Вероятная причина вашей проблемы - malloc() не удается выделить около 2 ГБ памяти в вашей системе. Вы должны проверить возвращаемое значение: если malloc() не удалось, он возвращает указатель NULL, который не может быть разыменован.

Кроме того, ваш первый фрагмент кода определяет arr как short вместо short *.

Вот типичный шаблон кода, который вы должны использовать:

    unsigned int size = 1073741824;
    short *arr = malloc(size * sizeof(short));
    if (arr == NULL) {
        fprintf("cannot allocate memory for %u shorts\n", size);
        exit(1);
    }
0 голосов
/ 19 апреля 2020

Я думаю, что ваша проблема в том, что функция mallo c возвращает NULL из-за большого размера массива. Использование mallo c напрямую весьма подвержено ошибкам. Поэтому лучше использовать макро-функцию, например:

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

#define NEW_ARRAY(ptr, length) \
{ \
        (ptr) = malloc((size_t) (length) * sizeof (ptr)[0]); \
        if ((ptr) == NULL) { \
                fputs("error: Memory exhausted\n", stderr); \
                exit(EXIT_FAILURE); \
        } \
}


int main(void)
{
    unsigned int arrLen = 1073741824;
    short *arr;

    NEW_ARRAY(arr, arrLen);
    /*...*/
    free(arr);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...