Есть ли лучшее решение, чтобы избежать моей «памяти превышена» ошибка в hackerearth - PullRequest
0 голосов
/ 10 января 2019
int **list, **short_list;
//num defines the number of rows and 2 defines no. of column needed
list = malloc(num * 2 * sizeof(int *));
short_list = malloc(num * 2 * sizeof(int *));

for(i = 0; i < num; i++){
    list[i] = malloc(num * 2 * sizeof(int));
    short_list[i] = malloc(num * 2 * sizeof(int));
}

Несмотря на то, что я создал динамическое выделение памяти, используя указатели на массив, я получил ошибку «Ограничение памяти превышено» для нескольких моих выходных данных в hackerearth. Это неправильный способ выделения памяти.

1 Ответ

0 голосов
/ 10 января 2019

Что-то не так с вашим распределением. В первом malloc вы получаете num * 2 указатели, но в цикле вы только инициализируете num этих указателей. Это точно ошибка.

Далее кажется странным, что вы внутри цикла снова используете num * 2. Это означает, что вы в конечном итоге выделяете num * num * 2 целых чисел. Скорее всего, это не то, что вы хотите.

Если вы действительно хотите, чтобы матрицы были num * 2, просто сделайте:

int **list, **short_list;
//num defines the number of rows and 2 defines no. of column needed

list = malloc(num * sizeof(int *));            // Only use num here
short_list = malloc(num * sizeof(int *));

for(i = 0; i < num; i++){               
    list[i] = malloc(2 * sizeof(int));         // Only use 2 here
    short_list[i] = malloc(2 * sizeof(int));
}

Другой и более простой способ выделить матрицу num * 2:

int (*list)[2];
list = malloc(num * sizeof *list);
...