У меня есть такой код:

#include <iostream>
#include <math.h>

int main()
{
    int n,m,k,hours;
    std::cin >> n >> m >> k;
    hours = std::ceil(n * k / (float)m);
    int* checkers = new int[m];
    int** check = new int*[hours];
    for(int i(0); i < hours; i++)
        check[i] = new int[n];
    for(int i(0); i < n; i++)
        checkers[i] = (i + 1) % m;
    std::cout << check[0][0];

    return 0;
}

С определенными входными данными, такими как 20 4 1, он возвращает ошибку сегментации, когда я пытаюсь распечатать чек [0] [0]. Но если я заменю int* checkers = new int[m]; вот так:

#include <iostream>
#include <math.h>

int main()
{
    int n,m,k,hours;
    std::cin >> n >> m >> k;
    hours = std::ceil(n * k / (float)m);
    int** check = new int*[hours];
    for(int i(0); i < hours; i++)
        check[i] = new int[n];
    int* checkers = new int[m];
    for(int i(0); i < n; i++)
        checkers[i] = (i + 1) % m;
    std::cout << check[0][0];

    return 0;
}

Он вернет malloc.c:2394: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.

Как я могу это исправить?

P.S. С вводом, например 3 1 1, все в порядке.

-1
Euler-Maskerony 27 Ноя 2020 в 18:23

1 ответ

Лучший ответ

Вы выделили m элементов для checkers при использовании элементов n.

Количество выделяемых и используемых элементов должно быть согласовано (выделите n элементов или используйте m элементов в зависимости от того, что вы хотите сделать).

Также обратите внимание, что содержимое new int[n] не инициализируется автоматически, поэтому вы не можете полагаться на значение check[0][0].

2
MikeCAT 27 Ноя 2020 в 15:26